From 075fae2e45fbc9a2ec49afc4e8e87ec749ef7d62 Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Sun, 11 Oct 2026 12:05:47 +0800 Subject: [PATCH] Add a coverage gate to validate-workflows and stop tracking .coverage Task: MIL-003#3 --- .coverage | Bin 90112 -> 0 bytes .coveragerc | 12 ++++++++++++ .gitea/workflows/validate-workflows.yml | 7 +++++-- .gitignore | 3 +++ README.md | 7 ++++--- tests/requirements.txt | 1 + tests/test_workflows.py | 16 ++++++++++++++++ wiki/Home.da.md | 9 +++++---- wiki/Home.md | 7 ++++--- wiki/Home.ms.md | 9 +++++---- 10 files changed, 55 insertions(+), 16 deletions(-) delete mode 100644 .coverage create mode 100644 .coveragerc diff --git a/.coverage b/.coverage deleted file mode 100644 index b813f425fd2cf84e7de9ad59548923c339e60ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 zcmeFa1(+1a`YvA5JzZU6xDyuF#aY}nxH~KhEU>@|yNgRQJ`f{LLPFeg5+H=QyAdTq z+(~lcE+=!pZ>p==%{iQh`~2_ozrS;C?-P07s_LGenwhuild76FWqeU(Va~GB^5TNZ zoF1eGp_B~C$svSD__rSXtN$zjh9>ZTS_K~uO44~ponUw-3HWA{@WNoDaBg6E;9LJC zfj;&Of05P6?hF;)pVtFk4|qM`^}v5k4@9N}tojWb(&*O8g2k%~E6WR(6qc+128T}_ zIduBSoasY{jUSn#%5vJt9Qe!4%^8|gUb;S~tgt+1S<&jkoT8GYMN0}Qi%OQ~RIVu0 zt=Co*F2ykm%3##OhMlw5Bg!vY3RhJYE{9u`l@}EklyA&gRk*QJwt@3%m4zEBRRP?j zuxNP+w#aGcT;4vXyl`1zd11+t!V2{i?TVJRm+fPxNUMJB+B8*|eNP4DOW+@WwRZyr z$KJ}x%iu;!O3Rnx(=RSBC|R}EU74} zEGjL@Dcn%FWNl^P(tr5|J7K5kKj^%w?*{I*2;a~mb*1xKReI;x#sA_;r@3?SGI+R> zQr)e`F2t9Hi?h#MvbK0Jbot7)#bx;6z!mC+D@%`eK;Xcuw zwz4$K^WnqK?*{(~#A^zxezRsYwI=&T!S2alTvS=%0=wFm#w|Y1R|o5l|GmLqN%b!Y z{)$$w&M94%{mJ0fIqJiKZ*$e(Oc&i51?Bid%PDml!jt}A{kGx5!ZYM7UR}Dl`gbk+ zjj1Sv9|&lHZnkV~$rAjjRN#A9Qo63NykL1@XQx)l!vF0r5`1;K*}nQCn;q|~<9-G5 zySY$C8v3mIjT_Ubo&6d)pO*7KtJ+scf0F+~Ms-zjVL`>(axEnPP9*ge$5c}PMw}XW zJGqvx{?Nw9dpl0M{B8~q5zDaZ*R4w<>KB2!g#Vh=-UOB$`w9GIAUN^IFDs~Ak@L^b zj>YicZB1YO{&kP{;P?pn-SEG@cny|)!U9GL{^BW%m1vH2d|$vFF(Hsv8{Ry6>S?`)qUgc~35_s3?MA z6^E^ge!4WL?TUg5RH2HtIg3k6R~HtPsIdXAIJp8|v#25``wag)Dh)n%kBW_WkLByy zW}it9E-3TU;YX)`UjT}W3rdzc;}s6W>aL*u_~XRaQ6d5t=Cp+$Wd;01|8h@#Q>PXc zOW(h98T1L>wYXrZ`nltWQss{8R}}u!?bK*AqM)*{vZ%N)2b*LcCi}%&Ur>>=q`VL+ zov}3gV9;YL{`yqvHe;YhYp8lR?c4Hy_uavdIKLbI7p-K0Q@KbpYSr)9kw(@!zhEU! z`4un|C@#?N)uF7~H|sBz$G&8fK&4@dRQ1b+9bTmmk*ZffMN}XAV%2rJl`}z-?St@? zH2gb(f4o1h2fQBedcf-euLryy@Or@O0j~$V9`Jg=>jAF^ydL=P>j6#~wb1@&;rB@R zEBKH1=kd0#*8^S;cs=0tfY$?F4|qM`^?=s{|B*cqV7zHqr-gK@L3!hb zP7Xlt&fW4lcgG}u7CuVCN5enjAF^ zydLm+!0mwmZ%VZrfJxricDw)>|2IQNNcf5HS>ZY1lK^^uUJrOZ;Prsl16~h!J>d0# z*8^S;cs=0tfY$?F5Bvx9z%bJw5qo66`Q?RWr4{q17nM)jSW#J6Jb!sn<%+e7a|^PY zhRm;ojS?#6S8OaR$X{Qyst7La$vG)K!Ar{v zVXuaYLbxiAaZ+)DS1nmlP_n#mb?I`rt~cdm?FnADcx}<@rTQ^3{%?lfB;hB+JHySw za{+pPUJrOZ;Prsl16~h!J>d0#*8^S;cs=0tfY$?F5Bw+fz;GjC(-X9bk7NIv{rJWc zy~SVbf1?*KJ<&^#+5fyZuQ<`Gs@ngoH(z_AzK&}4zqkM2f6`aldseRpydLm+!0Q38 z2fQBedcf-euLryy@Or@O0j~%Cw|js?&Oi|3|1|sufq%R|uLryy@Or@O0j~$V9`Jg= z>jAF^ydLm+!0Q382fQBmFYE!%gEq$hNsa%)H|M=2uLryy@Or@O0j~$V9`Jg=>jAF^ zydLm+!0Q382fQ9|djRAAp8fB3hX=eK@Or@O0j~$V9`Jg=>jAF^ydLm+!0Q382fQBm zuj~O6-W3mjh3~Cy__y#6;jhBah93#v9o`qdK73jDg76vPczAQTJX{oB6rL5H7#=T_v@TQ}S{j-c zni@JeG$hnJ)H&2T)Ff0pBtta#OYrO9C&9OauLPe7J{-I&xHouRa8L03;OW6wa8qzi za78dbI5RjQI3n0T*ge=jm=mlY3)+?U*1y}o)1UBf@|XIT z`ses3`iJ@R{2lx!`D^)o@;CXF{6M}cpO*K_{qkCQu{={o=JviJ<}d*53;-4ZR|#N$Y$av@ws?Myd)kM zcZ*xZmEr=iLu?b}VwspLCW>JqPjnC`iCV&E{bqe-ePF$6J#F1@?YFMAF1F6JqSiWV zrM1wSYK^k`S)HvGRy|Al{`7t4`^0y|cgXj!@1XBS-yYvNzNBxHuf(_5H`6!PH^|rB z*T&b#7xFRlC-Zaj9rGpgar18T7V}E;0&|DC%`7*UnRCsF<}fqQ>|mZ`)-rv@Z^l=~ z2ga+$)5iVAe&af0w{eycGu9i$Mu9QIIN2CzbTe8Tjg6XykN?iU;UDuO{CWN;zl-0( zuj0G-89d6@^VPh7&*bCy5Z;S-;LUg)ZnHnx_v|Qpo4v%IVE3|p>{_;)?PLieqJvCo zQ_6bfiReHDd-f910SX@KDWd%q>^@FJ`zhG5qlorZ@G!tW3U+>9M0-0hS48s^%HEh_-i1n~P{W1>cAJwpFkRz%~jtZX%+s6>QX4L|ZA?ppl5S zRIq*n5pAJh-TEThT){eZMKnjj+I2*O%+^GB%)0eT)sj?8!NbM zxfN{$(59@W6>W%xHp|%22BvK@MsCa$+R^$7pGwkpv|bj|uC$vSt*dYs+S!iQQMfbh zVn=H$+==$GqO|~1I&;4rt*J^w)U=~D6b{mm9Stko@6XTdXh`9{w4aCu5mP!49wwlQ zd(pmj)UR-NY%Uedk{+mS5_cZAoC zY*x4f?Py0f={6ng$VP?R(sp)agTifSTRXB|;nuW`9a*PvE85zQtW~%fZDmI)6>dSB z*^vr`o6{C{q+H<~+T4z;(d~2WNSVTouzjh*O=%-LQlfAZ+SHB|E8Lhiu_LQ>`^I); zmBJ0N{mLx<^E2Aejuff#8qiOX6$;m+HSEZ8h3nISc4V2twP;N{QmEV1vLj0su9LCs z$P$HXV4KAXhw(lI3QN5IB86=#?MS|E1LX@97VveBEKoQ|!**o8!T}nzBl8sY(|{eB zt1zc^?8qF2P0H=aY=s5&+mTrcTU6MQnF{+TJm(DE-e*UqD{SDiO;eat!;VZC9;ooAWjr39YQ*zXf^j7#2@~IukQ}|=@i5=;s@JHlhJJM6(5Ai-d6#jsGXh*tdaVCd+ zU`M*C^7qJ>cBHGqZ)f25)kWdA$lG?Lv%;@t`rDCQh2JD^*^y2fziCH0W^tx10o*~A zzd_!!BkdJFOkT7j?KD1YN7^d<3IW_k;g`uPcBHk!FOiq+NGpY3Brn;KmI^flT-JJLj#KVwH4XK|(%0o+L8 z{)ii@Hjj}v?1&@&50l62h$H?FlKbq45`XdldC-n1@hA6_2keLve{vsr*p4XiC-;*3 z?FfoL3?g@C3hjuJe{u)8(~c5p1FIVHWMB%H*)wYs?wa+R%=pX?!**-H4yrDTt-bU#x_F13~HlilQATd6+Tm04*k(a)?T zyKJTT|zJV}vL?G@^+B}md}49JY^CueM&kBTRT?2t zTPZw=zuV)m7LOwJr>G1rNzrE)No2y7h5Rcl$I~EP`xQFEw@m*DJ?6tP`9C^ z%tFzow4~HR#in%CY76C>(v{0B)M_Xxu~4WfEm~=zN>jR`$U=#xbomMk^%=k_3&ojI zm|vkX1E{dZWI^FFYjhSYEwn~u!JefSsxhUD*I6U7Ab-DwI!x(;d<#XG(mDGrRA5RM z?zd2Wp=zOp+DqyD1r`b~rSs-nsJfKSoo5Zmg4uH{)LTkt&$Uo&DV;UjLZzj2#!L%k z7QieEHI~x-Gb|KXN+&M1P+chPo8L@s8TxeWD6CQ(oy$VD5p>| z%0exr^q!Fx3Mr*S`&+1@lnxncp@dR8c!-7iN$H@$7K$fK?*>_@oRkh2Xtm3N{v)ln zS&%otYLf-M^DIQAp*&LBxr>F`NNH|o z3x$!=PPrDUBBdQWSxvH_Lq`kskka-&Efhman|H8K2?69-D1(%?dCx)(q_lM#3k8tU zR;?{mKT2D)vQYXc&1qqw?os+)j)kHJCCx2VJW8A9SSWXtHfd_1)=}EHiG@N(X`{v# zsvM>D8(AoEl-8?np}tXC7p%Q3s8iQMWuvrK9ZO_E&03a~1vP3~C}@<1Ygnjel!n5V zkp;n!g*rwlSoyV6X!6&LFN6Qqhz?@#KO=k}{Fl@Ve;s}|{CxO6dyT)9e~kYUu%s)4 zqrpP|J(LS}|1VJgarn*fi*Q!pec{`}H-LZO{P1bvNO*m?IJ^W-51bV4AGSl8aJO*V zaMN(@(2w95ct7-7=(*4%p}Ru2hOPfInC_NCQ6yJ`B7O z_%d*5;M~CT;0xFnSQ)q{a9v<~U|V2jV0>U$pm(4nZycx{Xy$()VEMoH|L*_L|BU}N z{{jE?-~ovHSNk{k7x}0A2l%`C8~6kA2S1TVKjVwC74nu%K0qr$X)v2L`!u->s=wC=DjwPIlD53`CaYE81{TfMAy zR>*1$HvSL3Pkqn%9`s%7yU2ICubb}_u51sjvwW3@FiWi z$yTuW?C*Nh*P%HY*Q!mMXkRKn0GB9~*P*;G>O9PsK(M$cBfYnQ-CSdkbTNAK*sn7%rUutOrmM`^b z0;VrDH38d~8k&IdOSvXs{Zgh0n7@>20`@N@nt%aJGMaz|O#ajaOkna4O~3{we`o?m zF!^1RcC-WeO%pJK$*-D#9ZY`F1Po#FvnF5(lbwG5Jgr zu#3r2O~5cFpK1b@G5JK3nzR=ASQD^~$w!)iaZEnc1gvB7fhJ%cllL_N`J0 z)dVbL@{T58B9pf@0UMdTr3o0x(0VSrf39$xE8RuZg_q5VV)c3l2epnLMuvSj^;*CSWp?=UhVTlV@E5 zS3RQ%Sk2^VO~7m>PiX>nGkH=IFr3K~$H+J2aZSKGyyxB z+^Go|(&P?Jz>+2hH33ta+^z}O(&T_9U`&(S9D>#~*{^HBoF@A;0ehP4)dUP`a;qj_ zQIlIV0h5~i?HGBJ-0ToEs>w~d2CQmwqb6WhlN*ka!{mBRz_2FQX#$otxmFV}t;sc- zfNf2#)&z`ea+M}vU6U&{d6B$IuFwSRYjU|JU|^HWGyw~n>~RSg)0eu0JVP#V2pZXB zw6(DiO-|DUtZuSH6EM5Uc1^(UCTUH; z@Fpou!15+ZO~CXf2~DmCOFXU#7~dqO30U7GstK6iB%%q}-{jQnpvfp&;HPK|Cipgu z!3N)|F&N=nj^V2|YYb-iCXK-k-{@d8#5d@2u*BDE45s)x-3Dy&wYnUP@k))s8n4h8 z%<*!K!5&|uF&N}!8iPe%>R>d z3XQ=sUw#aymT3&Od7;K&oG(3wV@os!^L%l3YQrel=LL3lmIDU*A_r~VmhYe~TNgTL z$Cd>SD%&~VK|9OlIky2beXdhjv1g8hikHoH(CXq@4k}+Z(?O->GaOV_I$f8QO>Z3_Yc*z3x_yp{(`{{nm2!tgXYc~=%Cqi252<5 zzk_DY?&qKxGy7^ZtB-^B&*<%-iHq|bH13XG4!UDpPY0bmv4?|3p4{C*qweXZ%SLr| z&^;r&IB019&JG$fG}l3chjen#purs-G;mM{2Mrk5-a-9GwsTP4fVK|mo!3T}^=|E; zUU{t?)U#Jh2X$@V!a-fSHg{0xE;$a$?cB^kopMidP{&S99n_&?69={L+1NqNJ2cWL zr=f$|yw|`%t=rUhP^;GU9Mqy!T?gf~sNVEf)1)zKj5Ic_52R1Q&&2uRvp_x5X%D_t4z(bB+((HWQTmKJT;{AC&;Prsl16~h!J>d0#*8^S;cs=0tfY$?F4|qNB zU)}={E~W+#5wpN|o3&H)73bMYz4-tCUi_a=;=?dno{h4r7<+Aqva1;TOHP!14@B58 zzP=LT?30b*MxN2$XkvsRuKuGFSBFSD#Mm!}{P|OPg%jsLMaB4i;~?7K4I}(MY5oJ^ z`w;Jk82`Nx+s6oh8Y2BA+020=$QhUf`2(0Y&=@iYXf|))2xbnbjDu{xfyy>`6!Hyj zv@Xr&BowQx1jt?(YY)t3FVutlg+IjCPX59@kil@pu{;O9oD=pP`-r{9o?#EL+t_uG z$$u7$vyH5n6;zA=>!ABzgY^G80IyrW-;B1?`1KC7r^bgn(!LtM+=bqw@u8k{fX25^ zpfdyL0|U2Ml$=U;I4&}l*#MFJb6r+J&ZN6twvb#&-Ix^Qx&Q00;>i8PB7kAEqeIxf`3&)i6<5bg!tSE1^bW7lYQet~j`vjwKg3rpMp!-GS0%(po~auAs~Xj-9{)dn zT)tZHyjooT1S9FyLh*kIt5=EGpID6j--XqW8%eJgaIY3TuNGE6ek8qGyu4Z@y=suY zTKu0LH}Qg2%c!W9H*x&*ifSnt)zT}fWo}f0iYEVRAVX-`qbZ zf9V^XSSAz%2IIjE!PUVm-NAh*~tb9-& zkk@Bd1Vm(oER?h4$+Ex9mCa;L$?YHQPhmB{Gxq)VKKm;Bd^=@tv{%^+>`C@eyNBJ{ zt`GL~@8V1Gu6R*AB5oJgiHpQ(Vyh?>1+X4qr06Z$i^d{oWvp+l53R%2lh)nV&DI`k zC#?Oiw3b=3t?||nt0&m?O{^N0;rqq+rSAjZtG=gw_xtvPx8P#mnZBrRoo}UYp>L{h zl&_z!v#*7(9{3CXG`}-HF^`ys%!kc`=8gPo{vm&jKf@p3w}HQ5H$RKVV7>k-p3kT8 z(Y!zJ!dvqC+|M$wTK`k_CVQSe!tP)Esq`NjPZ~#m*LdP2`kTfR zCemLu9zTKptns)h^bZ%0r$1?o`9B(uevp3WVD|5pQv8qf(qt16|FSUR|LY9;f4+U8 zKe|z)>9-n>97Vs;c*IEhwZ_9o(62NeHk^K`@sP3f3ylXpPCwIlz(9Ib~*7w`fTZYuvmAeMRG(=JaLfE6j7~3(iU(o}tg{7B6(A z?`iyafBK2W4-TV$*ZAN#`lH5|EMsm$-MPiAzAoRnhBeW6`$pE>@hkGoHWFvKE-NGF zu>LNaMQ&o#T{fBQW%(|fME0@yE*nn{utJxOA$PMPm*tXI*fw-{f`gHfn=}=p9iC>jxaNJxVWf z+oi$HeO?uopcfuvnGN)Om!+WPIaOGK?s6HJk@RerCCGMqT@{w3J6#6JVE}^g{K;iN=G^+8MavE`Q8I5UNww6BV;x!c35U6WQ z*V2tHE~8sCF4;_B4S{M?Qc7XnfWpNk6xIzmxR}Da0fkr2ps+qb;i8pvv&Jh{Qdl3L z%8$FAaRn{aZE$U)#)Zo$tS3;{E?q{8U0g_EJ%K7;GK0c;1%($cp|D;-;ew?UoCpqH zOkur(!ix%Mk;eHm=n9P&=F>wOFUY5`pg^@>u#i5d@%%*;79FVa`3op4G*EcnEc&d* zbLUZ5)S$}e&Z4mBK;b!aDJ*bMc=lXc;Nm&-8I5Pnr;A-Yn=aCL<}8}8@r+^$iyG8@ zX3V4uHJ(0$F3@=DbUI(-Dbwj(7f+@0G@g7reOlv5Q|KHQPo__443o9l8pC95md4|@ z(HR<#IYg&xJUWj)sqx6s^a&T|(McMQ$fMIV9zK#zaPbH_RpViKbc)79htbIz4;e}) zYCL#29p~a9biBrc2Gg+`56q*ZH6AdCp6ud*bd<*Z^XM3j`}L-26HAEtL{46~G88n@4-JzU(5cGtLFd)iIoHtlE^jbX;pS!0;7P?$sf{!7^N|FzJw zp@%{TLpOyk51k*{0sH+|!oGeBL(@WILIXqHLv3NN|C%9R@OOyee;hm#d_MRn?DKz1 z@T%Z0*wrr@Tn|zF0@&k!TyRLRSFi)@>{lmf2mXZp{V|UJV&L(>-GRSB9RJ)vGO#hQ zI*=cj8WK`akBs(|?nHkN<4g(QmzfrGEj$@Q1^W{_Xuu{5AcC z{8@f3--aFi9?99vkI-bkh4F+>I?h& zH-~-w{TA{4==? zb6jU!Y@A`7YE&4@Ae&>nG1%x1JNq{<{QOV;E&m9z1fJ&i@x8FC{{?(I-@;4zVm^b9 zfgFL(ygBUXZ?WIlm$2X8%j|J>7rPlU1kPazwt=mJFI4tV#+Shs@{DnEfEa~yIjHk<8`zmZ#He3na~W~M`KCV!Lh84kIL+$`hM z70EzQPsXP?H8+quWqhhbuF90j_!Ng+L#~qX$qu=iTqEO?bTe|bj8AmPZfrKeA$#x! z;~jD(l5q~Xoa~YDu?~TKjb!{}eGR!x#>Y4WqGvKb+9g-Y_$Y@!Bu&OgI%GGwM8-!r z1R`fLKHMSadDGuvbwk9$CJI+8rM z+37NlM?PT94sx1|TOS0XI{}K=4glL|h#M!8dNQ$!l@JSS`LKEYAOf^ zP{eB}xNNzIhZVeJnTSLF89u|(G7%3dxL}@$2NayYK*aqD&YLgdQo*^a=pQ1}6M>nCC;`&imd#8C7BzR*>~Q1Suh z0z|*~f5knaVIQe!FLlFl!X|jl+gaaI% zCt@hz07s6NF(u!OTnWQOOvyJRkUt?~O1>F^^a&YL^38Bpc^Omk%?L_A%IIt;km z)gq=eo8@$uG1P1*$g&YYakjNNHITFYpkuel=B#=HL zV<_iHAbUi{P|$&7V6~$iLrI4$A+jTC$57J|Z;#3tiaK7Ag3&C7vW_H;1ce<5(!4;M=h60Z@IE2Pf;*sDG8bgssf6k-#2=b}TFS*)^UbrWBuTC=oHG_-x|_JC;>^#vq$S#FXT- z4I4#FNj_V*LBy2gLyC!rDamJR%0!I8%fPp`e2s`H!Dlc`#+2Z*btNLI1RpX=L{ter zTMMO1@LAa!5mkcEO3Or42|j~SFscNfm24JKCHSm#t%#!F!>g5)il~x%Rtz^&a?fC( zjVifkOJ<0ul6$sziHM@y!(}U>REa$+SS+GS?AZ!SFazF&5_&dwmWVD^rL*RXs1kYxLv>UMJ%d3xs)U}wpd3{~&tOoFDxqi7 z;f0mZv#HZXR0%zUVK%CSo=t&LCG>346cJTI&tRC1Dxqf+CW@#MdUpE+5miFZ#%&W( zCG>2}ArVzV&qlzRWJ>5643JSJ^lTWEqR_*88#+uxvq}$=45g0L4;d<=j?@nyDWZ4#nbP>v_|EtQvi}bm4;u%K8)2vTbBv_1$tW=v8#9fu#vrg5+Zc_E5UgYWiNlSK zy9QthoE|tXJQ&UnY#VM2CkOJ-&!NvkZ^GFC4}|u?iGk8t3nGxli*B%9&k=z z{g4fwgD->c244(50;d677rZEVT5v0z3Q!Q7791Ju4d(zf4h936z_)M?z~R6Xfx7}X z!C3%j!8w2xfx^J7z{!FBfm}EPux5b!fAoLqe*^aZzt4ZG{|f)PaQfeRf02Kle}aFo zznj0MzpmeszsfJbPw>2aNZux|kr&GCaiD6JLC#T+qC3YQ|R?6CFt+Ez?FJP$E!)jwSfD``y@O|Zb&-aq=QQw`u zn|+u2&hw?g3s468{?GMI^bPan`8xPc^40SB%-_tfzz6WE`Lubzx!=6jyx2UGzr-Ks zcf+ZCSAzY%gKy*Id>Nn1C&F$8d2lA*NxT;Kfd&5+`+&X5o@V#6{cs}R#q3NLW$V~V zwvbI_qgX%I8NMP;>WT9|qihXts&VNW-pa*gTxY==C8bd&o@md-$Uc_r^T(Fqe(0EY+*BQFTqN})GieTgy@}O>$ zzleu4UYO4V8ZTJErN(n+aiQ_-Io#5C)@<%`@m_9gJaaEMG@dbwn=YQoxyIA?a;ovP z8JxLzI@eunOr6Fux_t5i_79CG9O617%osm`Kd#Hi9paB^Ja!a+RO2zD*sl(TX(@eC zV{fTOR{Hpi|G7&wj8>i4>-uwS*`2-N;#TZ6jdNPE!x}fsVLIpCIH?(XS(i6GiM^z8 zlcr362aHBd*bBP6VI%gu#tj-WoyBR?Z@_fsrctjxdserpTaW3COQTL*rn4Z8+I5)D zd^Bp+W=}eK_eL%Dgp+q~WSIM{eY+*o+55&Tx$I4S_d`9{dm8VZ%Kp^&s)gLI@vfD; zuExpDyuFh`Y-CO$Dc;#->&WT6o68oH>-cb&O(3`NDJ~mM?&tGdHjq5U3tZNKe8yqF zahP^e#;MFOowd%XmC0rMoQ53ciHzy|cGz8knoQ@~BjfBAw4WCMfibbdQ0Ka*dX&S>Xw*1^wAXS4%@XVH1_98O61iRt`y4hJFp$aH=? zFlec>CdZ2#!NwI;WkJugDKf=caSmXyj|AbJ{uiJNc4b;9mDR z`8(6u@0@%Nuc!0fIr$8j&aUTh48mtjZwJHS9E8u=+3sE7kOZbP<2f9Q@F~;z?i|iV z_=M?vcMb<5e9UydJBPy%K4LnV9Mr%{Ty{S!*SXte_mKx!vCHly_p#M3 zyNBG%R=MnM@&voH3cH7`bQ#1(*kYI6o|(l~xaw%hRY!Q!lt>kK!p6G{LM?2Z%OKXm#<~nnj$kJrV{qLBmt9J(WTUIFJ#382 zz!k?vxeQ`HY+@C52^;A$@Hep$E`taR8|E@_GO?j9178vwa*V;V40jnsVc4K5?0h!Z zWe}8M16>AwCpN%k5Q$;^Ty_RYvIkuT;TP81We}!eeXFq3S)R)v9K(85VLMn)mqA2_ z^>JC6>|ouiud6(vWSBOBAlSonsy+m0SW9P36GmuQ3w?3rPS#B0 zik+;r#^sglBo|k(9F5nMGi`A}M22ari5C|$ZB0SYhG~lnLN!cVTzpj#)7BJUxr*tz z6E9lH>R|l88Jj@D--ka5zX7@b4}|xJuL zL)`x`tlPgQbW7-p(0O3BZweKM7D3E^RH!ek+HV%B1t50)#21DPjvvjV=9{pd{~_~$c^z2#XPBo#tbds~#~g1CHoKdx%?73) zd^g`39~rM1PaF3cdyT7%3ykf?7NZnAH#3YeMt`HT(cGv5`!@W>zvS=nm%&$X7r&Wb z#?Rpiz5(_FSjeaF5xh5e3Yzj7aNgff>@)Tj>;~{KyPaJR`~98CB5>y4ayA#fKI%`V z(6b7MQQ(wJrqH*F1ZHG1h2B*ppOMdH3jM1G^HK)6gM(F?0;-jGT3!yCed39Bm*{=OrpOQYwjbD$Rv7fk-+ptCede$D1hBfHLMS^)F zN%Z3?0?p8qi{w^(9Q5TPxrN*+ljzMwf~g`&^yebM?2sgSbQRerljze$f~g`&^y(sk zld)tH{klltWGtCP&n^-;|4Js&w~GWLSxNNn0?B|KE0gHo#hN|jKAA)hFOuDvbux)Q zUL+W*OQM$-$wg$BOb*gD*leIfF2I@rF4--U{T*^X1F#43tbI2JG%S!fgYtEO+o({pdRI-QL>`a;L?vT^*MY}1I0sCDhyE-*HAaa@P z;*eD46q)SoGy|hwCUc#d2-zW$oq$kkY)gt{M+LWR6Uhz=Zr&o2?G;RJwv+7;GGh}Q zIh|~)iXmkp*+xN#`XpN`xPF&Nwo?yMS_&2dtf}DQMIu>4K?orw!%o`*kqjxA4-JA2EELIr zf)LG4`W3utp-4&v7pxFTTftd-MN%j@XO>7>3POxK>2n&)7D*g3;M1A`4RF8!I1?_z z;Q~u%iX;ve0H@6mNgOHwPKO3KP+;kFk-%XB;M8d%frA9Vy;DU3hX{a^7l;H75CBIV z5(yk05RMfI92@|S948VuGyohkN+fV#062P#NZ_!5ZAXg)4hq;78sLxsaOg;pzySf^ zFt{%c2LMM56A2s)uylk-;7|Z?IF#Z*fThDl0*3*B5I0JcC^&eiNZ=3vr9lml$iR3uQy0XAwP5-8&U8#WRN6mftJ8j1u;IKcW1 zL;?jIV7>Yxf$|NoZatAe@dj9@u1KJC1FT&~Bv7~k)~anKP_}J=RsuDf+D1kulwhO3 z;Tf4wg3SrI8)QNWHYZPzCq)7U8`47x4vGZIHNZs$GNHtpLvTGQ5-8SCo)1k>ssS#X zClV;s0Ovs|$~3}-B7q_eaBjX#D2e7UxZW)iDA7i_3%(XimWRwi8)_rs(pN38l|jAE!(xea^Z+WkTt5*54@;N}sbXO_@;o zob`RmgwkgYw_`Ga`V1*V=c z;YI=uO_@OH&R#=)lnE4XB;Zh#36yUn;8~Rk6mTTq+LQ^Da3tW_lnE4ZB;eST36yap z;MbH16mlfs)|3g9awIr~PN0}00XL>hpqyt3%%>A5=t#hcDHAB^NWg0;6DaD6d@d6x z>qx+ZDHAB{NWg(96DaLSz<((dDDFtW@hB50??}LxDHAC0NWhf|R+K|&$~X=NNWk4F<2W230so?m*UMv)$s}Q57^cIBlC3=bJ!1<*TedNNN_E93>E~ZK&-!S zFgKV3s{=&fkHA-f_X01$9)AY|*9R^JkHI$B;cszZdSDc+4Cny+`-K9;{~h=XUWMKL z?)Kjd-h!R}DD3UG415J+{R8}+VQ0Tuuqxmu@Dm(?ef{p2d*zk#Jeiam#`|tKU_6zpI;2XHs-evEwx7a22B73Sm!p^hX!AgLD_)~lXyX3zj9v63t z8^tB!OjrX@E|!X!VvOhqyY8PPY6xci0G@!?A^ZPc>lW*B>l`a?t+Q4@=KpwWkk!>{ zVb!sGu&3YWzPEgbd=J8oepmAzye)6c!(e&;%)VgnLYDm#>>hS2yNX@NPGhIA3b4H= z!H$bBz@Cej!=8&b!>)_x!HSKgu;XG+*l}?P?77%3TqE=g?6-JtcE80ZL$9!5+1(bG zXZKs22kSL@hkT)qkaICS)C^p7zlCanoA;~W2dqQzFs#*hBDg1b6PykXe~u^0JY}oV zSL4lFjP8zm%Pb*h8LilI5&$JPr_M8U@Z8*bjzNMK83VC=++jlp(#^4>3>`=}$BZ&` z@Z20d#?S$CbJSQv2hz<^qYWJ}H%E>#bRgXvF_h~tp*egg|3g3Au;Ki7jfallI*@J- z9maoi%MWuMY&VAtwT^6xb6 z*Oz~zao>LYYZv$7-)h`v0RKwk-hKI(8u#qYzi@Fc{&$Ug^yHsw+`R|?OyjPd_@^3o z>B>LRxN{f&vBtTb`9~Ue>due4IG2B@amT6reT~~4;W{*Hwr$7X)#YtE^0zf^`7VD; z;}$Ks4(poDk8&NvHXAnQI=F2%Xv1|7+icK~>)^Iow*l7yZL>~Yt^?X;?K)ihT+Ldw zxejQXHEVGl&^Bw-E%*`r#7EllcQiiSiGP4! zZ3z1sv}K0h<2aBFnv-e3by&urC($PSF1M~JJ&Ehki$R;vrd)?fkTvEy3}nDc`W$|* zdmXH+=Qkza7!T1or+Pw~HxekXzm>v$p+3nU5@(+HoW+X!izsO~Ok__MFvVTy{ zFLW8qSo!%bgNZ5E0cis!iNEp-+`3=MpZr{x{Q}qNptAuX_FuRTNCSg!oen`8I3wjc z1Pu)8bO_oY-;*D?4nYHhIvq+j$albWK-z$r=vQ0^mJOJSe#dn{8rj!ehmsALnSRf8 z=o;BqTnBoyzFw{q5wgx+9(Ugnczd}HL1#U@TnCo3j$FRYZ3&)SuEWJyS1#9q-mEW| zZ+2UPGna328B9g_sV)O|F5ggvy~lNUI_vl48{N8h$h&;K%fQ*o*SQQPv3#w|U>3`D zxH#+Y&KS+_6OA>pjw zm+O#l*73`A5IE~P<~q!r^#k)F_tn7>%ymdO>-^<92#oA$Ug)-jSuNLr-mK4<>i{vb zXSojMX5GPD2c5GnV7|z`3%Gr`4kc&(zFdcrvyNXr-)#xbUOv}l;5+8|E(3QjpY5_c z$=&?fD(o&k%Vh`20Y1G7yNypf#xfK5442&wEuV22xPZA1?Ph(=e2!ZOE@eKm3OmSk zfY>1W;mMwM>-ItZkPgvi{l#1dkF!2vuEV}rCo$K-)i}`qS7aUCEwVD-XoKESO5pE1_~VuOI6nD=+wvAXZasfe-)QZ6-qOYEcyo;_ z*K!@mH7eF}9RxNiD!C2<8|4*TN12T^6B%?vUYVX`gY%W?$+t0ZJbzGs76S({J^3~U^y3fc^8N$( z{TlZh$n?Y-+_g+k(2ahF_;rvmkG@P# z?!j%#^kf~JwM|0QC!m>`D1j{cn>)4!gOu&4hIkn8`B z^^)}je0W7knTcfRhRxYgkuVY!h-+W&}zW>X<$9;D}zW-&g>ObMz z;9CWI`cDCGNpHyZZ|bYz_ns0is_P;Dp0sJ9=di zP7>SECyQ{R*p41qfa52~?aCi(lD(NVa=Y@!n&4tzBetVI78;F$yP!7~AOxefqc0ZV zkdb0LdSU_g9xt||9~NL^oUkLO{zT{&P)$SpV|w<`y%3AqI?$?eJkYeH_pi*mbiz?#|Ig6+xyi#K>) zrj-NMBu~N((#ipA!tC-%nN|*1GwU)1J=yCOw-B%i#K>mrj-NMB#+|_ zlmpfz55ZeVD+jCz{?mtKS~+0Ntp7Bv9I(&~{HJN^qy<|Cw) z1J=yuBczoB)&&3Q9Wt#Pux8eOnpO^2liUUV)3kEHn%NYDv~s|j$W(Q%mw+w4-Ap5hSPh9W)LAs50z+w>%dTm;K$(-R$nsSfE04#9+m^mvEha@zDbhnx+| zY13mJat@>|q)&Eh&XMUc4#9+m^k_vgYsgMJJqii@uu{-!q|@pw2u!3$IAl9yAf$&o zWCz)9r-wP0oDP=^bzAL_=^+lmeJ9d`9fIp*(}NrWiHvr7AQE`V1YAGBtvFq#`#S{J z%%=OfBq`E;fq)X6vei!a!E(4dS|-xHRWWQekPwwg%yQV{l+NcU85-FiFS10gfF zz)lkB?y4BFCDPp#ggq?MU7f}oM7oQDumU#SS-}mPL^@Z&_3+A_6f9qBr#m8KW*Lc# zbO%*j0gc-`EhDCIKQ);JMA!O)p7U`C%c=;tF-9o{l zL9 zc?a03yGWt91MJ#Kq)^%ccIhfoDC__sT_T0D4iM5MQYh*GVHb(ZB85^8@JL&cLLmp(rlUxqj00@>u1KMX1B9(BQYhg7-)$jMDBu8_ z9~CK-Z-5P(ixi4CK**6up>zX0+CZdGxUsa2NTF;4tP7K&`tFt~CDI0rn+Ie{iFDTGB2!AF z4YD({PNYzzAsJ)cdXYkj1~}o6NTEOjggsJHsLue$K`E*;z_FubN@=q}Ytb4qmDOhO z>DS0KkSQh3Sf31&Bzg^I13)s!jJY$R|Bu1uk7D^gpgP`8nUXjrCDxse3%*-*QY zK%GpXcq8%CpiH5BBLT0zOrd}y5!5GBDB(!J`!7={;;NY?Qz+v|z`rk3DCCOxWeTMn z3Dn6Hia8Q+?#mR)ITG;g%M=Pa5OnR!6iPZ0@a)SJiaHW-?8_9&Iuh{R%M=Pb5==`; zp|q=--(?EL9SJz~WeVjT3HbD73I!esxb$TTB|b~Adr{<(V2Vj9qzTrb&|?ia@MQ|6 zK1(3^B!yy+1f2OYg>sJsJoGY!f{z4T`7(u)j|9B@GKHeAYQB~!lzny0R~Y~Q#8^VY z--SO4zZ!lrd^g0A_k?$bqv1-}`ENF4{|^Xv4(EhxK@|C?(9zHl*z@mxIJ56c%>5VF zhc<^wLrX%lLgPY%Vb#9c@y`tY3hVaYhY0dh!TW;yg4e*x{eO< z+3)xcUt~XJ-*Wojm25gYi+6Ac$1%he?$2f8*>KjMb+bRXG*W@9 z#b1hZ#V?DWvO8e1_-64~@kKI$PMZHG*c(t+ypucnRgwt&!%qKSISueDb_RSz`+u4| zV6f0z=;AEEhC+Q|UE!AWlR{M?<&J*WxUb(;?(26t9ZgH=K>93u0q#gQrt8z2)1~>} z(p>&e?&$YDum0cWu6|)pzjp5G*UXjwYx9rh@6WHq6;Qxq2Q!)V*^eoH_Tx?=Ew0y%#Ap%yr}^aqYhFaG3q1*uj#mrb9hyG!((_w zxqbtVDc5bnsB&#JURJKD#fWnC9ERuZe;_K5C3U0%c~NI7kO_6D0+~>!Dv$|vtOA)( z=PDSS_ZALTATR1<1u~kBRv?GzYz1U0HirjA!2XX<XZfYqK;W0FY25H@}dq}AlvDr1@fYfS|Bg#tOYWf4qG5E>a+#& zqK;c2FY3Gn@}dr0AQS4u1u~(ITp+*c%mwnId}HM?~w0 zEet1voT=r`@IG16P+fqGrg7ri8OVzon@1)fgKA+k9Ar?#k#9kk)WUE$JQ<%0Netvg zjlCr&A@^ya?F90oMsIiuGNDFOcmgt^#u;YgkO?)8H+vm&pW(hS$ctJSa0Z!B3rGf! z#DC49F-U|OhoAibiBQXt%0MF2C#2dz26MVXg9k5~Mt>_aN@p?Y#$3t-QY%cPa1dgL-4FXFsG! zt!E$9Cu`k3xLr?FSU+N$dOvd z1mst(eK*$VJnbEjFST9m&LwYEvD*6}-9ag%cE4phZF2{p}HOB-&~?JccX zrM$fbmCD<8Vuf<^43;WyZNf6;rmeUk<{2zk-qMUL<|bUPymBg* diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..c76bd08 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,12 @@ +# Coverage of the scripts in tools/ by the offline tests. validate-workflows.yml +# runs `coverage run -m pytest -q tests` and `coverage report`, which fails +# below fail_under. Measured at 97% on 2026-10-11; the gate leaves room for a +# few lines and fails when a tool grows without tests. +[run] +branch = True +source = tools + +[report] +fail_under = 95 +show_missing = True +skip_empty = True diff --git a/.gitea/workflows/validate-workflows.yml b/.gitea/workflows/validate-workflows.yml index ecb7ca7..fc52570 100644 --- a/.gitea/workflows/validate-workflows.yml +++ b/.gitea/workflows/validate-workflows.yml @@ -20,5 +20,8 @@ jobs: python3 -m venv .venv .venv/bin/python -m pip install --quiet -r tests/requirements.txt - - name: Validate workflow files and run the offline tests - run: .venv/bin/python -m pytest -q tests + - name: Validate workflow files and run the offline tests under coverage + run: .venv/bin/python -m coverage run -m pytest -q tests + + - name: Check the coverage of the tools + run: .venv/bin/python -m coverage report diff --git a/.gitignore b/.gitignore index 28e7ac1..8c2fc52 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ .venv/ __pycache__/ .pytest_cache/ + +# Local coverage data (python -m coverage run) +.coverage diff --git a/README.md b/README.md index e71fbe4..c18f973 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ Trigger -> Workflow: Start workflow activate Workflow Workflow -> Workflow: Check out the repository Workflow -> Workflow: Create a virtual environment and\ninstall tests/requirements.txt -Workflow -> Workflow: Run pytest on tests/ (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API +Workflow -> Workflow: Run pytest on tests/ under coverage (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API alt a test fails Workflow --> Trigger: Workflow fails (the pull request is not ready) @@ -298,10 +298,11 @@ The workflow files and the scripts in `tools/` are validated by offline tests th python3 -m venv .venv source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1 python -m pip install -r tests/requirements.txt -python -m pytest -q tests +python -m coverage run -m pytest -q tests +python -m coverage report ``` -The same checks run on every pull request and push to `main` through [`validate-workflows.yml`](.gitea/workflows/validate-workflows.yml). They parse every workflow as YAML, check that none embeds Python, compile the scripts in `tools/`, require explicit job permissions, and test credential parsing, push mirror address parsing and the sync and publish flows against a fake API. +The same checks run on every pull request and push to `main` through [`validate-workflows.yml`](.gitea/workflows/validate-workflows.yml). They parse every workflow as YAML, check that none embeds Python, compile the scripts in `tools/`, require explicit job permissions, and test credential parsing, push mirror address parsing and the sync and publish flows against a fake API. The run fails when the line and branch coverage of `tools/` falls below 95% (`.coveragerc`). After a change to the sync workflow, also trigger **Sync GitHub mirror metadata** manually in Gitea and compare the description and topics on the GitHub mirror. diff --git a/tests/requirements.txt b/tests/requirements.txt index 1b9f504..e18e2b4 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,2 +1,3 @@ pytest>=8,<10 PyYAML>=6,<7 +coverage>=7,<8 diff --git a/tests/test_workflows.py b/tests/test_workflows.py index f538616..5d249e4 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -73,3 +73,19 @@ def test_no_workflow_copy_outside_the_workflow_directories(): if path.name == SYNC_WORKFLOW.name ] assert not stray, f"duplicate workflow copies: {stray}" + + +def test_validation_runs_the_tests_under_a_coverage_gate(): + """validate-workflows.yml measures tools/ and fails below the .coveragerc limit.""" + text = (REPO_ROOT / ".gitea" / "workflows" / "validate-workflows.yml").read_text( + encoding="utf-8" + ) + assert "-m coverage run -m pytest -q tests" in text + assert "-m coverage report" in text + config = (REPO_ROOT / ".coveragerc").read_text(encoding="utf-8") + assert "source = tools" in config and "branch = True" in config + assert any( + line.replace(" ", "") == "fail_under=95" for line in config.splitlines() + ), "the gate is 95 percent" + requirements = (REPO_ROOT / "tests" / "requirements.txt").read_text(encoding="utf-8") + assert "coverage" in requirements diff --git a/wiki/Home.da.md b/wiki/Home.da.md index e8498fd..517eebb 100644 --- a/wiki/Home.da.md +++ b/wiki/Home.da.md @@ -1,4 +1,4 @@ - + > Dette er en oversættelse af [`Home`](Home). Den engelske side er autoritativ, og ændringer her bliver overskrevet, næste gang wikien publiceres. @@ -252,7 +252,7 @@ Trigger -> Workflow: Start workflow activate Workflow Workflow -> Workflow: Check out the repository Workflow -> Workflow: Create a virtual environment and\ninstall tests/requirements.txt -Workflow -> Workflow: Run pytest on tests/ (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API +Workflow -> Workflow: Run pytest on tests/ under coverage (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API alt a test fails Workflow --> Trigger: Workflow fails (the pull request is not ready) @@ -299,9 +299,10 @@ Workflow-filerne og scripts i `tools/` valideres af offline-tests, som hverken k python3 -m venv .venv source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1 python -m pip install -r tests/requirements.txt -python -m pytest -q tests +python -m coverage run -m pytest -q tests +python -m coverage report ``` -De samme kontroller kører ved hver pull request og hvert push til `main` gennem [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). De parser alle workflows som YAML, kontrollerer at ingen indlejrer Python, kompilerer scripts i `tools/`, kræver eksplicitte jobtilladelser og tester parsing af credentials, parsing af push-spejlets adresse og synkroniserings- og publiceringsforløbene mod et falsk API. +De samme kontroller kører ved hver pull request og hvert push til `main` gennem [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). De parser alle workflows som YAML, kontrollerer at ingen indlejrer Python, kompilerer scripts i `tools/`, kræver eksplicitte jobtilladelser og tester parsing af credentials, parsing af push-spejlets adresse og synkroniserings- og publiceringsforløbene mod et falsk API. Kørslen fejler, når linje- og forgreningsdækningen af `tools/` er under 95 % (`.coveragerc`). Efter en ændring af synkroniseringsworkflowet skal du også starte **Sync GitHub mirror metadata** manuelt i Gitea og sammenligne beskrivelsen og emnerne på GitHub-spejlet. diff --git a/wiki/Home.md b/wiki/Home.md index ace5bb7..840bb16 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -252,7 +252,7 @@ Trigger -> Workflow: Start workflow activate Workflow Workflow -> Workflow: Check out the repository Workflow -> Workflow: Create a virtual environment and\ninstall tests/requirements.txt -Workflow -> Workflow: Run pytest on tests/ (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API +Workflow -> Workflow: Run pytest on tests/ under coverage (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API alt a test fails Workflow --> Trigger: Workflow fails (the pull request is not ready) @@ -299,9 +299,10 @@ The workflow files and the scripts in `tools/` are validated by offline tests th python3 -m venv .venv source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1 python -m pip install -r tests/requirements.txt -python -m pytest -q tests +python -m coverage run -m pytest -q tests +python -m coverage report ``` -The same checks run on every pull request and push to `main` through [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). They parse every workflow as YAML, check that none embeds Python, compile the scripts in `tools/`, require explicit job permissions, and test credential parsing, push mirror address parsing and the sync and publish flows against a fake API. +The same checks run on every pull request and push to `main` through [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). They parse every workflow as YAML, check that none embeds Python, compile the scripts in `tools/`, require explicit job permissions, and test credential parsing, push mirror address parsing and the sync and publish flows against a fake API. The run fails when the line and branch coverage of `tools/` falls below 95% (`.coveragerc`). After a change to the sync workflow, also trigger **Sync GitHub mirror metadata** manually in Gitea and compare the description and topics on the GitHub mirror. diff --git a/wiki/Home.ms.md b/wiki/Home.ms.md index b834340..77825dc 100644 --- a/wiki/Home.ms.md +++ b/wiki/Home.ms.md @@ -1,4 +1,4 @@ - + > Ini ialah terjemahan [`Home`](Home). Halaman bahasa Inggeris ialah teks yang sah, dan perubahan di sini akan ditimpa pada penerbitan wiki yang seterusnya. @@ -252,7 +252,7 @@ Trigger -> Workflow: Start workflow activate Workflow Workflow -> Workflow: Check out the repository Workflow -> Workflow: Create a virtual environment and\ninstall tests/requirements.txt -Workflow -> Workflow: Run pytest on tests/ (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API +Workflow -> Workflow: Run pytest on tests/ under coverage (offline, no secrets):\nworkflows parse as YAML, no embedded Python,\nscripts compile, wiki pages and translations are current,\nsync, publish and release flows against a fake API alt a test fails Workflow --> Trigger: Workflow fails (the pull request is not ready) @@ -299,9 +299,10 @@ Fail aliran kerja dan skrip dalam `tools/` disahkan oleh ujian luar talian yang python3 -m venv .venv source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1 python -m pip install -r tests/requirements.txt -python -m pytest -q tests +python -m coverage run -m pytest -q tests +python -m coverage report ``` -Semakan yang sama dijalankan pada setiap pull request dan setiap push ke `main` melalui [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). Semakan itu menghurai setiap aliran kerja sebagai YAML, memastikan tiada yang menanam Python, mengkompil skrip dalam `tools/`, memerlukan kebenaran kerja yang jelas, dan menguji penghuraian kelayakan (credentials), penghuraian alamat push mirror serta aliran penyegerakan dan penerbitan terhadap API palsu. +Semakan yang sama dijalankan pada setiap pull request dan setiap push ke `main` melalui [`validate-workflows.yml`](https://git.tirsystem.com/TirSystem/github-action/src/branch/main/.gitea/workflows/validate-workflows.yml). Semakan itu menghurai setiap aliran kerja sebagai YAML, memastikan tiada yang menanam Python, mengkompil skrip dalam `tools/`, memerlukan kebenaran kerja yang jelas, dan menguji penghuraian kelayakan (credentials), penghuraian alamat push mirror serta aliran penyegerakan dan penerbitan terhadap API palsu. Larian gagal apabila liputan baris dan cabang `tools/` di bawah 95% (`.coveragerc`). Selepas perubahan pada aliran kerja penyegerakan, cetuskan juga **Sync GitHub mirror metadata** secara manual dalam Gitea dan bandingkan penerangan dan topik pada cermin GitHub. -- 2.54.0