==>(B Building on scovillain(B ==>(B Checking for remote environment...(B ==>(B Syncing package to remote host...(B sending incremental file list created directory packages/python-cyclopts ./ .SRCINFO 1,455B 100% 0B/s 0:00:00 1,455B 100% 0B/s 0:00:00 (xfr#1, to-chk=7/9) .nvchecker.toml 52B 100% 52,000B/s 0:00:00 52B 100% 52,000B/s 0:00:00 (xfr#2, to-chk=6/9) LICENSE 646B 100% 646,000B/s 0:00:00 646B 100% 646,000B/s 0:00:00 (xfr#3, to-chk=5/9) PKGBUILD 1,603B 100% 1,603,000B/s 0:00:00 1,603B 100% 1,603,000B/s 0:00:00 (xfr#4, to-chk=4/9) REUSE.toml 164B 100% 164,000B/s 0:00:00 164B 100% 164,000B/s 0:00:00 (xfr#5, to-chk=3/9) python-cyclopts-5.3.1-1.log 867B 100% 867,000B/s 0:00:00 867B 100% 867,000B/s 0:00:00 (xfr#6, to-chk=2/9) LICENSES/ LICENSES/0BSD.txt -> ../LICENSE sent 2,801 bytes received 191 bytes 1,994.67 bytes/sec total size is 4,139 speedup is 1.38 ==>(B Running pkgctl build --arch riscv64 on remote host...(B ==> WARNING:(B invalid architecture: riscv64(B ==>(B Updating pacman database cache(B [?25l:: Synchronizing package databases... core downloading... extra downloading... multilib downloading... [?25h==>(B Building python-cyclopts(B  ->(B repo: extra(B  ->(B arch: riscv64(B  ->(B worker: felix-11(B ==>(B Building python-cyclopts for [extra] (riscv64)(B ]3008;start=6cf56020d5584f589c0006c1cec8b4c7;user=felix;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=fe0c2a97e644499ebfbc06015a073354;pid=3152954;comm=sudo;targetuser=root;type=session\==>(B Locking clean chroot...(Bdone(B Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=aed32fcf79fb4282aa1e53bfcb623466;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=fe0c2a97e644499ebfbc06015a073354;pid=3156658;comm=systemd-nspawn;container=arch-nspawn-3156658;type=container\]11;?\]2;🔵 Container arch-nspawn-3156658 on scovillain.felixc.at\[?25l:: Synchronizing package databases... core downloading... extra downloading... :: Starting full system upgrade... there is nothing to do [?25h[!p]104\[?7h]3008;end=aed32fcf79fb4282aa1e53bfcb623466\==>(B Building in chroot for [extra] (riscv64)...(B ==>(B Synchronizing chroot copy [/var/lib/archbuild/extra-riscv64/root] -> [felix-11]...(Bdone(B ]3008;start=25a03077fce34a5f898c7c2f878516a9;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=fe0c2a97e644499ebfbc06015a073354;pid=3160911;comm=sudo;targetuser=felix;type=session\==>(B Making package: python-cyclopts 5.3.1-1 (Tue Oct 27 14:14:41 2026)(B ==>(B Retrieving sources...(B  ->(B Cloning cyclopts git repo...(B Cloning into bare repository '/home/felix/packages/python-cyclopts/cyclopts'... remote: Enumerating objects: 19038, done. remote: Counting objects: 0% (1/1153) remote: Counting objects: 1% (12/1153) remote: Counting objects: 2% (24/1153) remote: Counting objects: 3% (35/1153) remote: Counting objects: 4% (47/1153) remote: Counting objects: 5% (58/1153) remote: Counting objects: 6% (70/1153) remote: Counting objects: 7% (81/1153) remote: Counting objects: 8% (93/1153) remote: Counting objects: 9% (104/1153) remote: Counting objects: 10% (116/1153) remote: Counting objects: 11% (127/1153) remote: Counting objects: 12% (139/1153) remote: Counting objects: 13% (150/1153) remote: Counting objects: 14% (162/1153) remote: Counting objects: 15% (173/1153) remote: Counting objects: 16% (185/1153) remote: Counting objects: 17% (197/1153) remote: Counting objects: 18% (208/1153) remote: Counting objects: 19% (220/1153) remote: Counting objects: 20% (231/1153) remote: Counting objects: 21% (243/1153) remote: Counting objects: 22% (254/1153) remote: Counting objects: 23% (266/1153) remote: Counting objects: 24% (277/1153) remote: Counting objects: 25% (289/1153) remote: Counting objects: 26% (300/1153) remote: Counting objects: 27% (312/1153) remote: Counting objects: 28% (323/1153) remote: Counting objects: 29% (335/1153) remote: Counting objects: 30% (346/1153) remote: Counting objects: 31% (358/1153) remote: Counting objects: 32% (369/1153) remote: Counting objects: 33% (381/1153) remote: Counting objects: 34% (393/1153) remote: Counting objects: 35% (404/1153) remote: Counting objects: 36% (416/1153) remote: Counting objects: 37% (427/1153) remote: Counting objects: 38% (439/1153) remote: Counting objects: 39% (450/1153) remote: Counting objects: 40% (462/1153) remote: Counting objects: 41% (473/1153) remote: Counting objects: 42% (485/1153) remote: Counting objects: 43% (496/1153) remote: Counting objects: 44% (508/1153) remote: Counting objects: 45% (519/1153) remote: Counting objects: 46% (531/1153) remote: Counting objects: 47% (542/1153) remote: Counting objects: 48% (554/1153) remote: Counting objects: 49% (565/1153) remote: Counting objects: 50% (577/1153) remote: Counting objects: 51% (589/1153) remote: Counting objects: 52% (600/1153) remote: Counting objects: 53% (612/1153) remote: Counting objects: 54% (623/1153) remote: Counting objects: 55% (635/1153) remote: Counting objects: 56% (646/1153) remote: Counting objects: 57% (658/1153) remote: Counting objects: 58% (669/1153) remote: Counting objects: 59% (681/1153) remote: Counting objects: 60% (692/1153) remote: Counting objects: 61% (704/1153) remote: Counting objects: 62% (715/1153) remote: Counting objects: 63% (727/1153) remote: Counting objects: 64% (738/1153) remote: Counting objects: 65% (750/1153) remote: Counting objects: 66% (761/1153) remote: Counting objects: 67% (773/1153) remote: Counting objects: 68% (785/1153) remote: Counting objects: 69% (796/1153) remote: Counting objects: 70% (808/1153) remote: Counting objects: 71% (819/1153) remote: Counting objects: 72% (831/1153) remote: Counting objects: 73% (842/1153) remote: Counting objects: 74% (854/1153) remote: Counting objects: 75% (865/1153) remote: Counting objects: 76% (877/1153) remote: Counting objects: 77% (888/1153) remote: Counting objects: 78% (900/1153) remote: Counting objects: 79% (911/1153) remote: Counting objects: 80% (923/1153) remote: Counting objects: 81% (934/1153) remote: Counting objects: 82% (946/1153) remote: Counting objects: 83% (957/1153) remote: Counting objects: 84% (969/1153) remote: Counting objects: 85% (981/1153) remote: Counting objects: 86% (992/1153) remote: Counting objects: 87% (1004/1153) remote: Counting objects: 88% (1015/1153) remote: Counting objects: 89% (1027/1153) remote: Counting objects: 90% (1038/1153) remote: Counting objects: 91% (1050/1153) remote: Counting objects: 92% (1061/1153) remote: Counting objects: 93% (1073/1153) remote: Counting objects: 94% (1084/1153) remote: Counting objects: 95% (1096/1153) remote: Counting objects: 96% (1107/1153) remote: Counting objects: 97% (1119/1153) remote: Counting objects: 98% (1130/1153) remote: Counting objects: 99% (1142/1153) remote: Counting objects: 100% (1153/1153) remote: Counting objects: 100% (1153/1153), done. remote: Compressing objects: 0% (1/218) remote: Compressing objects: 1% (3/218) remote: Compressing objects: 2% (5/218) remote: Compressing objects: 3% (7/218) remote: Compressing objects: 4% (9/218) remote: Compressing objects: 5% (11/218) remote: Compressing objects: 6% (14/218) remote: Compressing objects: 7% (16/218) remote: Compressing objects: 8% (18/218) remote: Compressing objects: 9% (20/218) remote: Compressing objects: 10% (22/218) remote: Compressing objects: 11% (24/218) remote: Compressing objects: 12% (27/218) remote: Compressing objects: 13% (29/218) remote: Compressing objects: 14% (31/218) remote: Compressing objects: 15% (33/218) remote: Compressing objects: 16% (35/218) remote: Compressing objects: 17% (38/218) remote: Compressing objects: 18% (40/218) remote: Compressing objects: 19% (42/218) remote: Compressing objects: 20% (44/218) remote: Compressing objects: 21% (46/218) remote: Compressing objects: 22% (48/218) remote: Compressing objects: 23% (51/218) remote: Compressing objects: 24% (53/218) remote: Compressing objects: 25% (55/218) remote: Compressing objects: 26% (57/218) remote: Compressing objects: 27% (59/218) remote: Compressing objects: 28% (62/218) remote: Compressing objects: 29% (64/218) remote: Compressing objects: 30% (66/218) remote: Compressing objects: 31% (68/218) remote: Compressing objects: 32% (70/218) remote: Compressing objects: 33% (72/218) remote: Compressing objects: 34% (75/218) remote: Compressing objects: 35% (77/218) remote: Compressing objects: 36% (79/218) remote: Compressing objects: 37% (81/218) remote: Compressing objects: 38% (83/218) remote: Compressing objects: 39% (86/218) remote: Compressing objects: 40% (88/218) remote: Compressing objects: 41% (90/218) remote: Compressing objects: 42% (92/218) remote: Compressing objects: 43% (94/218) remote: Compressing objects: 44% (96/218) remote: Compressing objects: 45% (99/218) remote: Compressing objects: 46% (101/218) remote: Compressing objects: 47% (103/218) remote: Compressing objects: 48% (105/218) remote: Compressing objects: 49% (107/218) remote: Compressing objects: 50% (109/218) remote: Compressing objects: 51% (112/218) remote: Compressing objects: 52% (114/218) remote: Compressing objects: 53% (116/218) remote: Compressing objects: 54% (118/218) remote: Compressing objects: 55% (120/218) remote: Compressing objects: 56% (123/218) remote: Compressing objects: 57% (125/218) remote: Compressing objects: 58% (127/218) remote: Compressing objects: 59% (129/218) remote: Compressing objects: 60% (131/218) remote: Compressing objects: 61% (133/218) remote: Compressing objects: 62% (136/218) remote: Compressing objects: 63% (138/218) remote: Compressing objects: 64% (140/218) remote: Compressing objects: 65% (142/218) remote: Compressing objects: 66% (144/218) remote: Compressing objects: 67% (147/218) remote: Compressing objects: 68% (149/218) remote: Compressing objects: 69% (151/218) remote: Compressing objects: 70% (153/218) remote: Compressing objects: 71% (155/218) remote: Compressing objects: 72% (157/218) remote: Compressing objects: 73% (160/218) remote: Compressing objects: 74% (162/218) remote: Compressing objects: 75% (164/218) remote: Compressing objects: 76% (166/218) remote: Compressing objects: 77% (168/218) remote: Compressing objects: 78% (171/218) remote: Compressing objects: 79% (173/218) remote: Compressing objects: 80% (175/218) remote: Compressing objects: 81% (177/218) remote: Compressing objects: 82% (179/218) remote: Compressing objects: 83% (181/218) remote: Compressing objects: 84% (184/218) remote: Compressing objects: 85% (186/218) remote: Compressing objects: 86% (188/218) remote: Compressing objects: 87% (190/218) remote: Compressing objects: 88% (192/218) remote: Compressing objects: 89% (195/218) remote: Compressing objects: 90% (197/218) remote: Compressing objects: 91% (199/218) remote: Compressing objects: 92% (201/218) remote: Compressing objects: 93% (203/218) remote: Compressing objects: 94% (205/218) remote: Compressing objects: 95% (208/218) remote: Compressing objects: 96% (210/218) remote: Compressing objects: 97% (212/218) remote: Compressing objects: 98% (214/218) remote: Compressing objects: 99% (216/218) remote: Compressing objects: 100% (218/218) remote: Compressing objects: 100% (218/218), done. Receiving objects: 0% (1/19038) Receiving objects: 1% (191/19038) Receiving objects: 2% (381/19038) Receiving objects: 3% (572/19038) Receiving objects: 4% (762/19038) Receiving objects: 5% (952/19038) Receiving objects: 6% (1143/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 7% (1333/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 8% (1524/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 9% (1714/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 9% (1761/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 10% (1904/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 11% (2095/19038), 320.01 KiB | 481.00 KiB/s Receiving objects: 11% (2133/19038), 1.41 MiB | 652.00 KiB/s Receiving objects: 11% (2133/19038), 1.73 MiB | 531.00 KiB/s Receiving objects: 11% (2136/19038), 1.90 MiB | 482.00 KiB/s Receiving objects: 11% (2270/19038), 2.24 MiB | 493.00 KiB/s Receiving objects: 12% (2285/19038), 2.45 MiB | 484.00 KiB/s Receiving objects: 13% (2475/19038), 2.63 MiB | 468.00 KiB/s Receiving objects: 14% (2666/19038), 2.63 MiB | 468.00 KiB/s Receiving objects: 14% (2708/19038), 2.63 MiB | 468.00 KiB/s Receiving objects: 15% (2856/19038), 2.84 MiB | 434.00 KiB/s Receiving objects: 15% (2946/19038), 3.05 MiB | 383.00 KiB/s Receiving objects: 16% (3047/19038), 3.05 MiB | 383.00 KiB/s Receiving objects: 17% (3237/19038), 3.30 MiB | 352.00 KiB/s Receiving objects: 17% (3262/19038), 3.30 MiB | 352.00 KiB/s Receiving objects: 18% (3427/19038), 3.54 MiB | 354.00 KiB/s Receiving objects: 19% (3618/19038), 3.66 MiB | 366.00 KiB/s Receiving objects: 19% (3728/19038), 3.66 MiB | 366.00 KiB/s Receiving objects: 20% (3808/19038), 3.66 MiB | 366.00 KiB/s Receiving objects: 21% (3998/19038), 3.66 MiB | 366.00 KiB/s Receiving objects: 22% (4189/19038), 3.66 MiB | 366.00 KiB/s Receiving objects: 23% (4379/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 24% (4570/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 25% (4760/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 26% (4950/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 27% (5141/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 28% (5331/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 29% (5522/19038), 3.89 MiB | 380.00 KiB/s Receiving objects: 29% (5539/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 30% (5712/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 31% (5902/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 32% (6093/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 33% (6283/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 34% (6473/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 35% (6664/19038), 4.20 MiB | 370.00 KiB/s Receiving objects: 36% (6854/19038), 4.38 MiB | 365.00 KiB/s Receiving objects: 36% (6890/19038), 4.38 MiB | 365.00 KiB/s Receiving objects: 37% (7045/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 38% (7235/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 39% (7425/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 40% (7616/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 41% (7806/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 42% (7996/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 43% (8187/19038), 4.56 MiB | 370.00 KiB/s Receiving objects: 44% (8377/19038), 4.84 MiB | 400.00 KiB/s Receiving objects: 45% (8568/19038), 4.84 MiB | 400.00 KiB/s Receiving objects: 46% (8758/19038), 4.84 MiB | 400.00 KiB/s Receiving objects: 46% (8838/19038), 4.84 MiB | 400.00 KiB/s Receiving objects: 47% (8948/19038), 4.84 MiB | 400.00 KiB/s Receiving objects: 48% (9139/19038), 5.05 MiB | 389.00 KiB/s Receiving objects: 49% (9329/19038), 5.05 MiB | 389.00 KiB/s Receiving objects: 50% (9519/19038), 5.05 MiB | 389.00 KiB/s Receiving objects: 51% (9710/19038), 5.05 MiB | 389.00 KiB/s Receiving objects: 52% (9900/19038), 5.05 MiB | 389.00 KiB/s Receiving objects: 52% (9940/19038), 5.30 MiB | 380.00 KiB/s Receiving objects: 53% (10091/19038), 5.30 MiB | 380.00 KiB/s Receiving objects: 54% (10281/19038), 5.40 MiB | 350.00 KiB/s Receiving objects: 55% (10471/19038), 5.40 MiB | 350.00 KiB/s Receiving objects: 55% (10590/19038), 5.40 MiB | 350.00 KiB/s Receiving objects: 56% (10662/19038), 5.40 MiB | 350.00 KiB/s Receiving objects: 57% (10852/19038), 5.49 MiB | 342.00 KiB/s Receiving objects: 58% (11043/19038), 5.49 MiB | 342.00 KiB/s Receiving objects: 59% (11233/19038), 5.49 MiB | 342.00 KiB/s Receiving objects: 60% (11423/19038), 5.49 MiB | 342.00 KiB/s Receiving objects: 61% (11614/19038), 5.56 MiB | 321.00 KiB/s Receiving objects: 62% (11804/19038), 5.56 MiB | 321.00 KiB/s Receiving objects: 62% (11821/19038), 5.56 MiB | 321.00 KiB/s Receiving objects: 63% (11994/19038), 5.56 MiB | 321.00 KiB/s Receiving objects: 64% (12185/19038), 5.66 MiB | 289.00 KiB/s Receiving objects: 65% (12375/19038), 5.66 MiB | 289.00 KiB/s Receiving objects: 66% (12566/19038), 5.73 MiB | 270.00 KiB/s Receiving objects: 66% (12584/19038), 5.73 MiB | 270.00 KiB/s Receiving objects: 67% (12756/19038), 5.73 MiB | 270.00 KiB/s Receiving objects: 68% (12946/19038), 5.80 MiB | 237.00 KiB/s Receiving objects: 69% (13137/19038), 5.80 MiB | 237.00 KiB/s Receiving objects: 70% (13327/19038), 5.80 MiB | 237.00 KiB/s Receiving objects: 71% (13517/19038), 5.89 MiB | 199.00 KiB/s Receiving objects: 71% (13577/19038), 5.89 MiB | 199.00 KiB/s Receiving objects: 72% (13708/19038), 5.92 MiB | 166.00 KiB/s Receiving objects: 72% (13849/19038), 5.92 MiB | 166.00 KiB/s Receiving objects: 73% (13898/19038), 5.92 MiB | 166.00 KiB/s Receiving objects: 73% (13983/19038), 6.08 MiB | 112.00 KiB/s Receiving objects: 73% (14015/19038), 6.08 MiB | 112.00 KiB/s Receiving objects: 74% (14089/19038), 6.08 MiB | 112.00 KiB/s Receiving objects: 75% (14279/19038), 6.14 MiB | 104.00 KiB/s Receiving objects: 76% (14469/19038), 6.14 MiB | 104.00 KiB/s Receiving objects: 76% (14597/19038), 6.14 MiB | 104.00 KiB/s Receiving objects: 77% (14660/19038), 6.22 MiB | 104.00 KiB/s Receiving objects: 77% (14719/19038), 6.28 MiB | 97.00 KiB/s Receiving objects: 78% (14850/19038), 6.40 MiB | 94.00 KiB/s Receiving objects: 78% (14873/19038), 6.40 MiB | 94.00 KiB/s Receiving objects: 78% (14954/19038), 6.50 MiB | 88.00 KiB/s Receiving objects: 79% (15041/19038), 6.50 MiB | 88.00 KiB/s Receiving objects: 80% (15231/19038), 6.50 MiB | 88.00 KiB/s Receiving objects: 81% (15421/19038), 6.50 MiB | 88.00 KiB/s Receiving objects: 82% (15612/19038), 6.50 MiB | 88.00 KiB/s Receiving objects: 82% (15641/19038), 6.63 MiB | 90.00 KiB/s Receiving objects: 83% (15802/19038), 6.63 MiB | 90.00 KiB/s Receiving objects: 84% (15992/19038), 6.63 MiB | 90.00 KiB/s Receiving objects: 85% (16183/19038), 6.63 MiB | 90.00 KiB/s Receiving objects: 85% (16353/19038), 6.76 MiB | 113.00 KiB/s Receiving objects: 86% (16373/19038), 6.76 MiB | 113.00 KiB/s Receiving objects: 86% (16469/19038), 6.83 MiB | 112.00 KiB/s Receiving objects: 86% (16534/19038), 6.99 MiB | 121.00 KiB/s Receiving objects: 87% (16564/19038), 7.06 MiB | 122.00 KiB/s Receiving objects: 87% (16687/19038), 7.15 MiB | 132.00 KiB/s Receiving objects: 87% (16737/19038), 7.24 MiB | 139.00 KiB/s Receiving objects: 88% (16754/19038), 7.31 MiB | 134.00 KiB/s Receiving objects: 88% (16885/19038), 7.37 MiB | 128.00 KiB/s Receiving objects: 89% (16944/19038), 7.43 MiB | 129.00 KiB/s Receiving objects: 90% (17135/19038), 7.43 MiB | 129.00 KiB/s Receiving objects: 90% (17316/19038), 7.52 MiB | 131.00 KiB/s Receiving objects: 91% (17325/19038), 7.52 MiB | 131.00 KiB/s Receiving objects: 91% (17510/19038), 7.61 MiB | 132.00 KiB/s Receiving objects: 92% (17515/19038), 7.61 MiB | 132.00 KiB/s Receiving objects: 92% (17703/19038), 7.80 MiB | 132.00 KiB/s Receiving objects: 93% (17706/19038), 7.80 MiB | 132.00 KiB/s Receiving objects: 94% (17896/19038), 7.87 MiB | 130.00 KiB/s Receiving objects: 94% (17986/19038), 7.87 MiB | 130.00 KiB/s Receiving objects: 95% (18087/19038), 7.96 MiB | 127.00 KiB/s Receiving objects: 96% (18277/19038), 7.96 MiB | 127.00 KiB/s Receiving objects: 97% (18467/19038), 7.96 MiB | 127.00 KiB/s Receiving objects: 98% (18658/19038), 7.96 MiB | 127.00 KiB/s Receiving objects: 98% (18690/19038), 7.96 MiB | 127.00 KiB/s Receiving objects: 99% (18848/19038), 7.96 MiB | 127.00 KiB/s remote: Total 19038 (delta 1002), reused 944 (delta 935), pack-reused 17885 (from 2) Receiving objects: 100% (19038/19038), 8.09 MiB | 127.00 KiB/s Receiving objects: 100% (19038/19038), 8.15 MiB | 226.00 KiB/s, done. Resolving deltas: 0% (0/14488) Resolving deltas: 1% (145/14488) Resolving deltas: 2% (290/14488) Resolving deltas: 3% (435/14488) Resolving deltas: 4% (580/14488) Resolving deltas: 5% (725/14488) Resolving deltas: 6% (870/14488) Resolving deltas: 7% (1015/14488) Resolving deltas: 8% (1160/14488) Resolving deltas: 9% (1304/14488) Resolving deltas: 10% (1449/14488) Resolving deltas: 11% (1594/14488) Resolving deltas: 12% (1739/14488) Resolving deltas: 13% (1884/14488) Resolving deltas: 14% (2029/14488) Resolving deltas: 15% (2174/14488) Resolving deltas: 16% (2319/14488) Resolving deltas: 17% (2463/14488) Resolving deltas: 18% (2608/14488) Resolving deltas: 19% (2753/14488) Resolving deltas: 20% (2898/14488) Resolving deltas: 21% (3043/14488) Resolving deltas: 22% (3188/14488) Resolving deltas: 23% (3333/14488) Resolving deltas: 24% (3478/14488) Resolving deltas: 25% (3622/14488) Resolving deltas: 26% (3767/14488) Resolving deltas: 27% (3912/14488) Resolving deltas: 28% (4057/14488) Resolving deltas: 29% (4202/14488) Resolving deltas: 30% (4347/14488) Resolving deltas: 31% (4492/14488) Resolving deltas: 32% (4637/14488) Resolving deltas: 33% (4782/14488) Resolving deltas: 34% (4926/14488) Resolving deltas: 35% (5071/14488) Resolving deltas: 36% (5217/14488) Resolving deltas: 37% (5361/14488) Resolving deltas: 38% (5506/14488) Resolving deltas: 39% (5651/14488) Resolving deltas: 40% (5796/14488) Resolving deltas: 41% (5942/14488) Resolving deltas: 42% (6089/14488) Resolving deltas: 43% (6230/14488) Resolving deltas: 43% (6251/14488) Resolving deltas: 44% (6375/14488) Resolving deltas: 45% (6520/14488) Resolving deltas: 46% (6666/14488) Resolving deltas: 47% (6810/14488) Resolving deltas: 48% (6955/14488) Resolving deltas: 49% (7100/14488) Resolving deltas: 50% (7244/14488) Resolving deltas: 51% (7389/14488) Resolving deltas: 52% (7534/14488) Resolving deltas: 53% (7679/14488) Resolving deltas: 54% (7824/14488) Resolving deltas: 55% (7969/14488) Resolving deltas: 56% (8114/14488) Resolving deltas: 57% (8259/14488) Resolving deltas: 58% (8404/14488) Resolving deltas: 59% (8548/14488) Resolving deltas: 60% (8693/14488) Resolving deltas: 61% (8838/14488) Resolving deltas: 62% (8983/14488) Resolving deltas: 63% (9129/14488) Resolving deltas: 64% (9273/14488) Resolving deltas: 65% (9418/14488) Resolving deltas: 66% (9563/14488) Resolving deltas: 67% (9707/14488) Resolving deltas: 68% (9852/14488) Resolving deltas: 69% (9997/14488) Resolving deltas: 70% (10142/14488) Resolving deltas: 71% (10287/14488) Resolving deltas: 72% (10432/14488) Resolving deltas: 73% (10577/14488) Resolving deltas: 74% (10722/14488) Resolving deltas: 75% (10866/14488) Resolving deltas: 76% (11011/14488) Resolving deltas: 77% (11158/14488) Resolving deltas: 78% (11301/14488) Resolving deltas: 78% (11319/14488) Resolving deltas: 79% (11447/14488) Resolving deltas: 80% (11591/14488) Resolving deltas: 81% (11737/14488) Resolving deltas: 82% (11881/14488) Resolving deltas: 83% (12026/14488) Resolving deltas: 84% (12170/14488) Resolving deltas: 85% (12315/14488) Resolving deltas: 86% (12460/14488) Resolving deltas: 87% (12605/14488) Resolving deltas: 88% (12750/14488) Resolving deltas: 89% (12895/14488) Resolving deltas: 90% (13040/14488) Resolving deltas: 91% (13185/14488) Resolving deltas: 92% (13330/14488) Resolving deltas: 93% (13474/14488) Resolving deltas: 94% (13619/14488) Resolving deltas: 95% (13764/14488) Resolving deltas: 96% (13909/14488) Resolving deltas: 97% (14054/14488) Resolving deltas: 98% (14199/14488) Resolving deltas: 99% (14345/14488) Resolving deltas: 100% (14488/14488) Resolving deltas: 100% (14488/14488), done. ==>(B Validating source files with sha512sums...(B cyclopts ... Passed ]3008;end=25a03077fce34a5f898c7c2f878516a9\Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=bac1db2a412343f5a282546a4308aac0;user=root;hostname=scovillain.felixc.at;machineid=5bc7e45048834d3a82e1c93a2f026cc1;bootid=fe0c2a97e644499ebfbc06015a073354;pid=3171799;comm=systemd-nspawn;container=makechrootpkg-python-cyclopts.build.3152979;type=container\]11;?\]2;🔵 Container makechrootpkg-python-cyclopts.build.3152979 on scovillain.felixc.at\]3008;start=62f13228dd05476184152caea5b5ac78;user=root;hostname=makechrootpkg-python-cyclopts.build.3152979;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=4d866a2e1b824876aae229f55c2fc001;pid=14;comm=sudo;targetuser=builduser;type=session\==>(B Making package: python-cyclopts 5.3.1-1 (Tue Oct 27 14:18:27 2026)(B ==>(B Checking runtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=d7f0280b1e1e473ab619dcbfed67d02d;user=builduser;hostname=makechrootpkg-python-cyclopts.build.3152979;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=4d866a2e1b824876aae229f55c2fc001;pid=887;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... Package (7) New Version Net Change Download Size extra/python-markdown-it-py 4.2.0-1 0.81 MiB extra/python-mdurl 0.1.2-9 0.06 MiB extra/python-pygments 2.21.0-1 15.59 MiB extra/python-attrs 26.1.0-1 0.63 MiB extra/python-docstring-parser 0.18.0-1 0.27 MiB 0.05 MiB extra/python-rich 15.0.0-1 4.49 MiB extra/python-rich-rst 2.2.0-1 3.65 MiB 0.56 MiB Total Download Size: 0.61 MiB Total Installed Size: 25.49 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... python-rich-rst-2.2.0-1-any downloading... python-docstring-parser-0.18.0-1-any downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing python-attrs... installing python-docstring-parser... installing python-mdurl... installing python-markdown-it-py... Optional dependencies for python-markdown-it-py python-mdit_py_plugins: core plugins python-linkify-it-py: linkify extension installing python-pygments... installing python-rich... installing python-rich-rst... :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate... [?25h]3008;end=d7f0280b1e1e473ab619dcbfed67d02d\==>(B Checking buildtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=0af2b371133a4bad84e1dbfa745dc0c7;user=builduser;hostname=makechrootpkg-python-cyclopts.build.3152979;machineid=f7ddc4a20a754cfcac5123f2ba16e0f3;bootid=4d866a2e1b824876aae229f55c2fc001;pid=955;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... warning: insufficient columns available for table display Packages (78) libyaml-0.2.5-3 mkdocs-get-deps-0.2.0-3 perl-error-0.17030-3 perl-mailtools-2.22-3 perl-timedate-2.35-1 python-annotated-types-0.8.0-1 python-autocommand-2.2.2-9 python-babel-2.18.0-1 python-certifi-2026.10.19-1 python-charset-normalizer-3.5.1-1 python-click-8.5.0-1 python-editables-0.6-1 python-ghp-import-2.1.0-6 python-idna-3.20-1 python-imagesize-2.0.1-1 python-importlib-metadata-9.1.0-1 python-iniconfig-2.3.0-1 python-jaraco.collections-5.1.0-3 python-jaraco.context-6.1.2-1 python-jaraco.functools-4.1.0-3 python-jaraco.text-4.0.0-4 python-jinja-1:3.1.6-3.1 python-markdown-3.11.2-1 python-markupsafe-3.0.4-1 python-mergedeep-1.3.4-5 python-more-itertools-11.2.1-1 python-outcome-1.3.0.post0-7 python-packaging-26.3-1 python-pathspec-1.1.1-1 python-platformdirs-4.13.5-1 python-pluggy-1.7.0-1 python-ptyprocess-0.7.0-9 python-pydantic-core-3:2.50.1-1 python-pyproject-hooks-1.3.3-1 python-pytz-2026.1-1 python-pyyaml-env-tag-1.1-1 python-requests-2.34.2-1 python-roman-numerals-py-4.1.0-1 python-setuptools-1:84.2.1-1.1 python-setuptools-scm-10.3.4-1 python-snowballstemmer-3.1.1-1 python-sortedcontainers-2.4.0-8 python-sphinx-alabaster-theme-1.0.0-6 python-sphinxcontrib-applehelp-2.0.0-5.1 python-sphinxcontrib-devhelp-2.0.0-6.1 python-sphinxcontrib-htmlhelp-2.1.0-5.1 python-sphinxcontrib-jsmath-1.0.1-21.1 python-sphinxcontrib-qthelp-2.0.0-5.1 python-sphinxcontrib-serializinghtml-2.0.0-5.1 python-tomlkit-0.15.2-1 python-trove-classifiers-2026.9.21.13-1 python-typing-inspection-0.4.4-1 python-typing_extensions-4.16.0-1 python-urllib3-2.8.0-1 python-vcs-versioning-2.6.0-1 python-watchdog-6.0.0-2 python-wheel-0.48.0-1 python-zipp-3.21.0-4 zlib-ng-2.3.3-1 fish-4.9.3-1 git-2.56.0-1 mkdocs-1.6.1-3 python-build-1.6.1-1 python-docutils-1:0.23-1 python-hatch-vcs-0.5.0-4.1 python-hatchling-1.32.4-1 python-installer-1.1.0-1 python-pexpect-4.9.0-7.1 python-pydantic-2.14.1-1 python-pytest-1:9.1.1-1 python-pytest-mock-3.16.0-1 python-pytest-timeout-2.5.0-1 python-sniffio-1.3.1-5 python-sphinx-9.1.0-1 python-syrupy-6.1.1-1 python-trio-0.34.0-1 python-yaml-6.0.3-2 zsh-5.9.2-1 Total Download Size: 4.48 MiB Total Installed Size: 176.42 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... mkdocs-1.6.1-3-any downloading... python-pydantic-2.14.1-1-any downloading... python-importlib-metadata-9.1.0-1-any downloading... mkdocs-get-deps-0.2.0-3-any downloading... python-ghp-import-2.1.0-6-any downloading... python-mergedeep-1.3.4-5-any downloading... python-pyyaml-env-tag-1.1-1-any downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing perl-error... installing perl-timedate... installing perl-mailtools... installing zlib-ng... installing git... Optional dependencies for git git-zsh-completion: upstream zsh completion tk: gitk and git gui openssh: ssh transport and crypto man: show help with `git command --help` perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-cgi: gitweb (web interface) support python: git svn & git p4 [installed] subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed] less: the default pager for git installing python-packaging... installing python-pyproject-hooks... installing python-build... Optional dependencies for python-build python-pip: to use as the Python package installer (default) python-uv: to use as the Python package installer python-virtualenv: to use virtualenv for build isolation installing python-editables... installing python-pathspec... Optional dependencies for python-pathspec python-google-re2: re2 backend installing python-pluggy... installing python-tomlkit... installing python-trove-classifiers... installing python-hatchling... installing python-more-itertools... installing python-jaraco.functools... installing python-jaraco.context... installing python-autocommand... installing python-jaraco.text... Optional dependencies for python-jaraco.text python-inflect: for show-newlines script installing python-jaraco.collections... installing python-platformdirs... installing python-wheel... Optional dependencies for python-wheel python-keyring: for wheel.signatures python-xdg: for wheel.signatures python-setuptools: for legacy bdist_wheel subcommand [pending] installing python-setuptools... installing python-vcs-versioning... Optional dependencies for python-vcs-versioning python-rich: formatting of log messages [installed] installing python-setuptools-scm... Optional dependencies for python-setuptools-scm python-rich: use rich as console log handler [installed] installing python-hatch-vcs... installing python-installer... installing fish... Optional dependencies for fish python: man page completion parser / web config tool [installed] pkgfile: command-not-found hook groff: --help for built-in commmands [installed] mandoc: --help for built-in commmands (alternative) xsel: X11 clipboard integration xclip: X11 clipboard integration (alternative) wl-clipboard: Wayland clipboard integration installing python-mergedeep... installing libyaml... installing python-yaml... installing mkdocs-get-deps... installing python-pytz... installing python-babel... installing python-click... installing python-ghp-import... installing python-zipp... installing python-importlib-metadata... installing python-markupsafe... installing python-jinja... Optional dependencies for python-jinja python-babel: for i18n support [installed] installing python-markdown... Optional dependencies for python-markdown python-yaml: parse Python in YAML metadata [installed] python-pygments: Code highlighting [installed] installing python-pyyaml-env-tag... installing python-typing_extensions... installing python-watchdog... Optional dependencies for python-watchdog python-yaml: for watchmedo [installed] installing mkdocs... Optional dependencies for mkdocs python-lunr: to prebuild search index installing python-docutils... Optional dependencies for python-docutils python-myst-parser: to parse input in "Markdown" (CommonMark) format python-pillow: for some image manipulation operations python-pygments: for syntax highlighting of code directives and roles [installed] installing python-ptyprocess... installing python-pexpect... installing python-annotated-types... installing python-typing-inspection... installing python-pydantic-core... installing python-pydantic... Optional dependencies for python-pydantic mypy: for type validation with mypy python-dotenv: for .env file support python-email-validator: for email validation python-hypothesis: for hypothesis plugin when using legacy v1 installing python-iniconfig... installing python-pytest... installing python-pytest-mock... installing python-pytest-timeout... installing python-sniffio... installing python-imagesize... installing python-charset-normalizer... installing python-idna... installing python-urllib3... Optional dependencies for python-urllib3 python-brotli: Brotli support python-brotlicffi: Brotli support python-h2: HTTP/2 support python-pysocks: SOCKS support installing python-certifi... installing python-requests... Optional dependencies for python-requests python-chardet: alternative character encoding library python-pysocks: SOCKS proxy support installing python-roman-numerals-py... installing python-snowballstemmer... Optional dependencies for python-snowballstemmer python-pystemmer: for improved performance installing python-sphinx-alabaster-theme... installing python-sphinxcontrib-applehelp... installing python-sphinxcontrib-devhelp... installing python-sphinxcontrib-htmlhelp... installing python-sphinxcontrib-jsmath... installing python-sphinxcontrib-qthelp... installing python-sphinxcontrib-serializinghtml... installing python-sphinx... Optional dependencies for python-sphinx imagemagick: for ext.imgconverter texlive-fontsextra: for the default admonition title icons in PDF output texlive-latexextra: for generation of PDF documentation installing python-syrupy... Optional dependencies for python-syrupy python-attrs: attrs serializer plugin [installed] python-pydantic: Pydantic serializer plugin [installed] installing python-outcome... installing python-sortedcontainers... installing python-trio... installing zsh... Optional dependencies for zsh grml-zsh-config: grml's zsh setup zsh-autosuggestions: Fish-like autosuggestions for zsh zsh-completions: Additional completion definitions for Zsh zsh-doc: Info, HTML and PDF format of the ZSH documentation zsh-history-substring-search: ZSH port of Fish history search (up arrow) zsh-lovers: A collection of tips, tricks and examples for the Z shell. zsh-syntax-highlighting: Fish shell like syntax highlighting for Zsh zshdb: A debugger for zsh scripts :: Running post-transaction hooks... (1/4) Creating system user accounts... Creating group 'git' with GID 968. Creating user 'git' (git daemon user) with UID 968 and GID 968. (2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Arming ConditionNeedsUpdate... (4/4) Checking for old perl modules... WARNING: '/usr/lib/perl5/5.42' contains data from at least 2 packages which will NOT be used by the installed perl interpreter. -> Run the following command to get a list of affected packages: pacman -Qqo '/usr/lib/perl5/5.42' [?25h]3008;end=0af2b371133a4bad84e1dbfa745dc0c7\==>(B Retrieving sources...(B ==> WARNING:(B Skipping all source file integrity checks.(B ==>(B Extracting sources...(B  ->(B Creating working copy of cyclopts git repo...(B Cloning into 'cyclopts'... done. Switched to a new branch 'makepkg' ==>(B Starting build()...(B * Getting build dependencies for wheel... * Building wheel... Successfully built cyclopts-5.3.1-py3-none-any.whl ==>(B Starting check()...(B ============================= test session starts ============================== platform linux -- Python 3.14.8, pytest-9.1.1, pluggy-1.7.0 rootdir: /build/python-cyclopts/src/cyclopts configfile: pyproject.toml plugins: platformdirs-4.13.5, timeout-2.4.0, mock-3.16.0, syrupy-6.1.1 timeout: 60.0s timeout method: signal timeout func_only: False collected 4321 items / 13 deselected / 4308 selected tests/apps/test_burgery.py .... [ 0%] tests/cli/test_complete.py ........ [ 0%] tests/cli/test_generate_docs.py ........... [ 0%] tests/cli/test_run.py ............... [ 0%] tests/cli/test_tree.py ....... [ 1%] tests/completion/test_bash.py .......................................... [ 2%] ........... [ 2%] tests/completion/test_behavior.py ....................F.F.FFFFFFFFFFFFF. [ 3%] FF....................ssssssssssssssssssss. [ 4%] tests/completion/test_detect.py ........................... [ 4%] tests/completion/test_dynamic.py ....................................... [ 5%] .......................................s...s.F.s...s...F.s.F.s...s [ 7%] tests/completion/test_fish.py .................................. [ 8%] tests/completion/test_install.py ....................................... [ 8%] ........s. [ 9%] tests/completion/test_powershell.py ..................ssssssssssssssssss [ 9%] ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss [ 11%] ssssssssssssssssssss. [ 12%] tests/completion/test_readline.py ........................ [ 12%] tests/completion/test_zsh.py ........................................... [ 13%] ......................... [ 14%] tests/config/test_common.py ..................... [ 14%] tests/config/test_dict.py .............................................. [ 15%] ........................................................................ [ 17%] ........................................................................ [ 19%] .. [ 19%] tests/config/test_end2end.py ... [ 19%] tests/config/test_env.py .......... [ 19%] tests/config/test_json.py .......... [ 19%] tests/config/test_source_parameter.py ............... [ 20%] tests/config/test_toml.py .. [ 20%] tests/config/test_toml_dataclass_list.py ......... [ 20%] tests/config/test_yaml.py ...... [ 20%] tests/config/test_yaml_dataclass_list.py ....... [ 20%] tests/py312/test_stdio_path.py ...................................... [ 21%] tests/py312/test_type_alias_parameter.py ..................... [ 22%] tests/py312/test_type_alias_type.py .......... [ 22%] tests/py312/test_validator_slice_set.py . [ 22%] tests/test_annotations.py ..................................... [ 23%] tests/test_app_attribute_inheritance.py ...................... [ 23%] tests/test_app_name_derivation.py .. [ 23%] tests/test_app_stack_overrides.py ....... [ 23%] tests/test_app_utils.py .....s [ 24%] tests/test_argument.py ................................................. [ 25%] ......................... [ 25%] tests/test_async.py ........... [ 25%] tests/test_bind_attrs.py .......... [ 26%] tests/test_bind_basic.py ............................................... [ 27%] ........................................................................ [ 28%] ...................................... [ 29%] tests/test_bind_boolean_flag.py ........................................ [ 30%] ..... [ 30%] tests/test_bind_converter_validator.py .......................... [ 31%] tests/test_bind_custom_type.py .. [ 31%] tests/test_bind_dataclasses.py ............................. [ 32%] tests/test_bind_dict.py ......................................... [ 33%] tests/test_bind_empty_iterable.py ...................................... [ 34%] ....... [ 34%] tests/test_bind_env_var.py ........... [ 34%] tests/test_bind_generic_class.py ...... [ 34%] tests/test_bind_kwargs.py ... [ 34%] tests/test_bind_list.py ................................................ [ 35%] ...................... [ 36%] tests/test_bind_namedtuple.py ... [ 36%] tests/test_bind_no_parse.py ........... [ 36%] tests/test_bind_none.py ................................................ [ 37%] ........................................................................ [ 39%] ................ [ 39%] tests/test_bind_pos_only.py ........... [ 40%] tests/test_bind_tuple.py ................. [ 40%] tests/test_bind_typed_dict.py .......... [ 40%] tests/test_bind_union.py ............................................... [ 41%] ........................................................................ [ 43%] ........................................................................ [ 45%] ................................................................ [ 46%] tests/test_bind_unpack_typed_dict.py .......... [ 46%] tests/test_bind_var_pos.py .. [ 46%] tests/test_coercion.py ................................................. [ 48%] ........................................................................ [ 49%] .......................................................... [ 51%] tests/test_command_collision.py ... [ 51%] tests/test_command_tree.py ...... [ 51%] tests/test_console.py ......... [ 51%] tests/test_docs_base.py ........ [ 51%] tests/test_docs_e2e.py ................ [ 51%] tests/test_docs_snapshots.py ........................ [ 52%] tests/test_docs_types.py ........ [ 52%] tests/test_edit.py ........... [ 52%] tests/test_enum_flag.py .............................. [ 53%] tests/test_env_var.py ...................... [ 54%] tests/test_error_console.py ............. [ 54%] tests/test_error_formatter.py ............. [ 54%] tests/test_exceptions.py .................. [ 55%] tests/test_exceptions_rich.py .......................................... [ 56%] ...... [ 56%] tests/test_future_annotations.py ....... [ 56%] tests/test_generate_docs.py ...................................... [ 57%] tests/test_generate_html_docs.py ................ [ 57%] tests/test_generate_rst_docs.py .................... [ 58%] tests/test_group.py ............... [ 58%] tests/test_group_extractors.py ......... [ 58%] tests/test_help.py ..................................................... [ 60%] ........................................................................ [ 61%] ..................... [ 62%] tests/test_help_customization.py ....................................... [ 63%] ..... [ 63%] tests/test_help_metavar.py ............................................. [ 64%] ...................... [ 64%] tests/test_html_formatter.py ............... [ 65%] tests/test_init_stub.py . [ 65%] tests/test_instantiating_module.py ... [ 65%] tests/test_interactive_shell.py ........................................ [ 66%] .............. [ 66%] tests/test_issue_643_flag_change_bug.py ........... [ 66%] tests/test_json_string_dict.py ........... [ 66%] tests/test_json_string_list.py ......................................... [ 67%] ......................................... [ 68%] tests/test_json_string_special_types.py ................... [ 69%] tests/test_lazy_commands.py ........................................ [ 70%] tests/test_loader.py ...........ssss........ [ 70%] tests/test_markdown_formatter.py ................... [ 71%] tests/test_meta.py ................ [ 71%] tests/test_mkdocs_ext.py ..................................... [ 72%] tests/test_name_transform.py ................. [ 72%] tests/test_nested_command_filtering.py .......... [ 73%] tests/test_new_type.py ........ [ 73%] tests/test_panel.py ... [ 73%] tests/test_parameter.py ............................................... [ 74%] tests/test_parameter_allow_leading_hyphen.py .. [ 74%] tests/test_parameter_choices.py ................................... [ 75%] tests/test_parameter_count.py .................................... [ 76%] tests/test_parameter_decorator.py ....... [ 76%] tests/test_parameter_n_tokens.py .......................... [ 76%] tests/test_parse_command_indices.py ........ [ 77%] tests/test_parse_mode.py ............................................... [ 78%] ................................ [ 78%] tests/test_parse_mode_fuzz.py .......................................... [ 79%] ........................................................................ [ 81%] .................................... [ 82%] tests/test_performance.py ..... [ 82%] tests/test_pydantic.py ................................................. [ 83%] ........................................................................ [ 85%] ..... [ 85%] tests/test_requires_equals.py ................ [ 85%] tests/test_result_action.py ............................................ [ 86%] .................................................... [ 87%] tests/test_run.py . [ 88%] tests/test_runtime_exceptions.py ................... [ 88%] tests/test_short_alias.py ...................................... [ 89%] tests/test_sphinx_ext.py ........................... [ 89%] tests/test_structured_type_parameter_kinds.py .......... [ 90%] tests/test_subapp.py ........ [ 90%] tests/test_subapp_flatten.py ................. [ 90%] tests/test_tokenization_error.py ..... [ 90%] tests/test_trio.py ..... [ 91%] tests/test_utils.py .................................................... [ 92%] .... [ 92%] tests/test_validate_command.py . [ 92%] tests/test_version.py ............................ [ 92%] tests/test_version_parameter.py .... [ 93%] tests/types/test_types_json.py . [ 93%] tests/types/test_types_nested_annotations.py ................ [ 93%] tests/types/test_types_number.py ................. [ 93%] tests/types/test_types_path.py ......................................... [ 94%] ................................................... [ 96%] tests/types/test_types_slice.py .. [ 96%] tests/types/test_types_web.py ........... [ 96%] tests/validators/test_validator_group.py .......... [ 96%] tests/validators/test_validator_number.py .............................. [ 97%] ........................................................................ [ 98%] .... [ 99%] tests/validators/test_validator_path.py ..................... [ 99%] tests/validators/test_validator_slice.py ...................... [100%] =================================== FAILURES =================================== _____________________ test_behavior[zsh-root-subcommands] ______________________ scenario_id = 'root-subcommands' app = App(name=('basic',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'basic', partial = 'basic ', contains = {'deploy'}, excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9f0040> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1479 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ________________________ test_behavior[zsh-flag-prefix] ________________________ scenario_id = 'flag-prefix' app = App(name=('basic',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'basic', partial = 'basic --v', contains = {'--verbose'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9df950> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1519 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _______________________ test_behavior[zsh-negative-flag] _______________________ scenario_id = 'negative-flag' app = App(name=('negapp',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'negapp', partial = 'negapp --no-', contains = {'--no-colors'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9deb90> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1559 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ___________________ test_behavior[zsh-literal-option-value] ____________________ scenario_id = 'literal-option-value' app = App(name=('basic',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'basic', partial = 'basic deploy --env ' contains = {'dev', 'prod', 'staging'}, excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9b6cf0> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1579 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ____________________ test_behavior[zsh-literal-positional] _____________________ scenario_id = 'literal-positional' app = App(name=('poslit',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'poslit', partial = 'poslit command ' contains = {'bar', 'baz', 'foo'}, excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9c7ab0> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1598 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT __________________ test_behavior[zsh-multi-positional-second] __________________ scenario_id = 'multi-positional-second' app = App(name=('multipos',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'multipos', partial = 'multipos command-multi red ' contains = {'cat', 'dog'}, excludes = {'blue', 'red'} shell_tester_factory = ._make_tester at 0x3f8a9c7e20> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1614 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _____________________ test_behavior[zsh-nested-subcommand] _____________________ scenario_id = 'nested-subcommand' app = App(name=('nested',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'nested', partial = 'nested config ', contains = {'get', 'set'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9deb90> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1630 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ______________________ test_behavior[zsh-path-positional] ______________________ scenario_id = 'path-positional' app = App(name=('pathpos',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'pathpos', partial = 'pathpos process ', contains = None excludes = set() shell_tester_factory = ._make_tester at 0x3f8a99b530> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:301: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1646 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ________________________ test_behavior[zsh-enum-value] _________________________ scenario_id = 'enum-value' app = App(name=('enumapp',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'enumapp', partial = 'enumapp --speed ', contains = {'fast', 'slow'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8aa077f0> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1662 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ______________________ test_behavior[zsh-list-of-literal] ______________________ scenario_id = 'list-of-literal' app = App(name=('disabledneg',), alias=(), synonym=(), default_parameter=Parameter(negative=()), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'disabledneg', partial = 'disabledneg build --param ' contains = {'apple', 'banana', 'cherry'}, excludes = set() shell_tester_factory = ._make_tester at 0x3f8a9f0040> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1678 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _______________________ test_behavior[zsh-help-at-root] ________________________ scenario_id = 'help-at-root' app = App(name=('basic',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'basic', partial = 'basic --h', contains = {'--help'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8aa078a0> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1694 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _________________ test_behavior[zsh-equals-form-option-value] __________________ scenario_id = 'equals-form-option-value' app = App(name=('basic',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'basic', partial = 'basic deploy --env=p', contains = {'prod'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8a8e8300> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1710 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ___________________ test_behavior[zsh-help-at-nested-depth] ____________________ scenario_id = 'help-at-nested-depth' app = App(name=('nested',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'nested', partial = 'nested config --h', contains = {'--help'} excludes = set() shell_tester_factory = ._make_tester at 0x3f8a8e8930> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1726 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT __________________ test_behavior[zsh-multi-positional-third] ___________________ scenario_id = 'multi-positional-third' app = App(name=('multipos3',), alias=(), synonym=(), version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'multipos3', partial = 'multipos3 command-multi3 red cat ' contains = {'large', 'small'}, excludes = {'blue', 'cat', 'dog', 'red'} shell_tester_factory = ._make_tester at 0x3f8a8e8250> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1742 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _________________ test_behavior[zsh-iterable-positional-rest] __________________ scenario_id = 'iterable-positional-rest' app = App(name=('listpath',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'listpath', partial = 'listpath a.txt ', contains = None excludes = set() shell_tester_factory = ._make_tester at 0x3f8a8e8d50> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:301: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1758 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT _________________ test_behavior[zsh-union-whole-value-options] _________________ scenario_id = 'union-whole-value-options' app = App(name=('unionval',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'unionval', partial = 'unionval --' contains = {'--level', '--level.a', '--no-opts', '--opts', '--opts.a', '--plain.a'} excludes = {'--plain'} shell_tester_factory = ._make_tester at 0x3f8a8e9c70> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1795 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT ____________ test_behavior[zsh-union-whole-value-flag-then-option] _____________ scenario_id = 'union-whole-value-flag-then-option' app = App(name=('unionval',), alias=(), synonym=(), default_command=, version_flags=('--version',), help_flags=('--help', '-h'), group=(), validator=[], sort_key=) prog_name = 'unionval', partial = 'unionval --opts --' contains = {'--level', '--level.a', '--plain.a'}, excludes = set() shell_tester_factory = ._make_tester at 0x3f8a8e96f0> @pytest.mark.parametrize( ("scenario_id", "app", "prog_name", "partial", "contains", "excludes"), SCENARIOS, ids=[s[0] for s in SCENARIOS], ) def test_behavior( scenario_id, app, prog_name, partial, contains, excludes, shell_tester_factory, ): tester = shell_tester_factory(app, prog_name) # Path-completion scenarios opt in with ``contains=None``. Different # shells format file completions differently (fish: full path, bash: # basename, zsh: a mix), so exact content checks would be brittle — # we only assert the driver returns a non-empty result with a real # file in cwd. if contains is None: import os import tempfile from pathlib import Path as _Path with tempfile.TemporaryDirectory() as tmpdir: (_Path(tmpdir) / "sample.txt").write_text("x") cwd = _Path.cwd() try: os.chdir(tmpdir) results = tester.get_completions(partial) finally: os.chdir(cwd) assert results, f"[{scenario_id}] expected some file-completion result for {partial!r}, got nothing" return > results = tester.get_completions(partial) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /build/python-cyclopts/src/cyclopts/tests/completion/test_behavior.py:307: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-cyclopts/src/cyclopts/tests/completion/conftest.py:362: in get_completions child.expect("ZTEST> ", timeout=4) /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:354: in expect return self.expect_list(compiled_pattern_list, /usr/lib/python3.14/site-packages/pexpect/spawnbase.py:383: in expect_list return exp.expect_loop(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop return self.timeout(e) ^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = err = TIMEOUT('Timeout exceeded.') def timeout(self, err=None): spawn = self.spawn spawn.before = spawn._before.getvalue() spawn.after = TIMEOUT index = self.searcher.timeout_index if index >= 0: spawn.match = TIMEOUT spawn.match_index = index return index else: spawn.match = None spawn.match_index = None msg = str(spawn) msg += '\nsearcher: %s' % self.searcher if err is not None: msg = str(err) + '\n' + msg exc = TIMEOUT(msg) exc.__cause__ = None # in Python 3.x we can use "raise exc from None" > raise exc E pexpect.exceptions.TIMEOUT: Timeout exceeded. E E command: /usr/bin/zsh E args: [b'/usr/bin/zsh', b'--no-globalrcs', b'-i'] E buffer (last 100 chars): '' E before (last 100 chars): '' E after: E match: None E match_index: None E exitstatus: None E flag_eof: False E pid: 1811 E child_fd: 13 E closed: False E timeout: 5 E delimiter: E logfile: None E logfile_read: None E logfile_send: None E maxread: 2000 E ignorecase: False E searchwindowsize: None E delaybeforesend: 0.05 E delayafterclose: 0.1 E delayafterterminate: 0.1 E searcher: searcher_re: E 0: re.compile('ZTEST> ') /usr/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT __________________________ test_e2e_descriptions[zsh] __________________________ dynamic_completion_tester = ._make at 0x3f8a7f2f00> shell = 'zsh' def test_e2e_descriptions(dynamic_completion_tester, shell): tester = dynamic_completion_tester(E2E_APP_SOURCE, prog_name="deployer", shell=shell) result = sorted(_lead(c) for c in tester.get_completions("deployer deploy --env ")) > assert result == ["dev", "prod"] E AssertionError: assert [] == ['dev', 'prod'] E E Right contains 2 more items, first extra item: 'dev' E Use -v to get more diff /build/python-cyclopts/src/cyclopts/tests/completion/test_dynamic.py:1022: AssertionError ______________________ test_e2e_eq_form_option_value[zsh] ______________________ dynamic_completion_tester = ._make at 0x3f8a813270> shell = 'zsh' def test_e2e_eq_form_option_value(dynamic_completion_tester, shell): """``--user=al`` completes the same candidates as ``--user al``.""" tester = dynamic_completion_tester(E2E_APP_SOURCE, prog_name="deployer", shell=shell) result = [_lead(c) for c in tester.get_completions("deployer deploy --user=a")] > assert result == ["alice"] E AssertionError: assert [] == ['alice'] E E Right contains one more item: 'alice' E Use -v to get more diff /build/python-cyclopts/src/cyclopts/tests/completion/test_dynamic.py:1106: AssertionError ______________________ test_e2e_dependent_completion[zsh] ______________________ dynamic_completion_tester = ._make at 0x3f8a812350> shell = 'zsh' def test_e2e_dependent_completion(dynamic_completion_tester, shell): """The headline feature: --cluster candidates gated on the typed --region.""" tester = dynamic_completion_tester(E2E_APP_SOURCE, prog_name="deployer", shell=shell) west = [_lead(c) for c in tester.get_completions("deployer deploy --region us-west --cluster ")] > assert sorted(west) == ["wa-1", "wa-2"] E AssertionError: assert [] == ['wa-1', 'wa-2'] E E Right contains 2 more items, first extra item: 'wa-1' E Use -v to get more diff /build/python-cyclopts/src/cyclopts/tests/completion/test_dynamic.py:1115: AssertionError --------------------------- snapshot report summary ---------------------------- 24 snapshots passed. =========================== short test summary info ============================ FAILED tests/completion/test_behavior.py::test_behavior[zsh-root-subcommands] FAILED tests/completion/test_behavior.py::test_behavior[zsh-flag-prefix] - pe... FAILED tests/completion/test_behavior.py::test_behavior[zsh-negative-flag] - ... FAILED tests/completion/test_behavior.py::test_behavior[zsh-literal-option-value] FAILED tests/completion/test_behavior.py::test_behavior[zsh-literal-positional] FAILED tests/completion/test_behavior.py::test_behavior[zsh-multi-positional-second] FAILED tests/completion/test_behavior.py::test_behavior[zsh-nested-subcommand] FAILED tests/completion/test_behavior.py::test_behavior[zsh-path-positional] FAILED tests/completion/test_behavior.py::test_behavior[zsh-enum-value] - pex... FAILED tests/completion/test_behavior.py::test_behavior[zsh-list-of-literal] FAILED tests/completion/test_behavior.py::test_behavior[zsh-help-at-root] - p... FAILED tests/completion/test_behavior.py::test_behavior[zsh-equals-form-option-value] FAILED tests/completion/test_behavior.py::test_behavior[zsh-help-at-nested-depth] FAILED tests/completion/test_behavior.py::test_behavior[zsh-multi-positional-third] FAILED tests/completion/test_behavior.py::test_behavior[zsh-iterable-positional-rest] FAILED tests/completion/test_behavior.py::test_behavior[zsh-union-whole-value-options] FAILED tests/completion/test_behavior.py::test_behavior[zsh-union-whole-value-flag-then-option] FAILED tests/completion/test_dynamic.py::test_e2e_descriptions[zsh] - Asserti... FAILED tests/completion/test_dynamic.py::test_e2e_eq_form_option_value[zsh] FAILED tests/completion/test_dynamic.py::test_e2e_dependent_completion[zsh] === 20 failed, 4145 passed, 143 skipped, 13 deselected in 594.47s (0:09:54) ==== ==> ERROR:(B A failure occurred in check().(B  Aborting...(B ]3008;end=62f13228dd05476184152caea5b5ac78\[!p]104\[?7h]3008;end=bac1db2a412343f5a282546a4308aac0\==> ERROR:(B Build failed, check /var/lib/archbuild/extra-riscv64/felix-11/build(B [?12l[?25h[?12l[?25h]3008;end=6cf56020d5584f589c0006c1cec8b4c7\[?12l[?25hreceiving incremental file list python-cyclopts-5.3.1-1-riscv64-build.log python-cyclopts-5.3.1-1-riscv64-check.log sent 62 bytes received 6,636 bytes 4,465.33 bytes/sec total size is 94,919 speedup is 14.17