From 9b3ed558afb2ea4bc01f3305cf49ed8bd71c09a1 Mon Sep 17 00:00:00 2001 From: Antonio Cavallo Date: Mon, 8 Apr 2024 09:44:42 -0400 Subject: [PATCH 1/3] add beta build publishing --- .github/workflows/push-main.yml | 17 +++- health-checker.pyz | Bin 16259 -> 23296 bytes luxos.pyz | Bin 16246 -> 23283 bytes make.py | 146 ++++++++++++++++++-------------- src/luxos/__init__.py | 2 + 5 files changed, 100 insertions(+), 65 deletions(-) diff --git a/.github/workflows/push-main.yml b/.github/workflows/push-main.yml index bcb5ebb..b58fb5f 100644 --- a/.github/workflows/push-main.yml +++ b/.github/workflows/push-main.yml @@ -11,6 +11,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }} env: PACKAGE: luxos + GITHUB_DUMP: ${{ toJson(github) }} jobs: build: @@ -68,14 +69,24 @@ jobs: --junitxml=$OUTDIR/junit/junit.xml --html=$OUTDIR/junit/junit.html --self-contained-html \ tests + - name: Dump env + shell: bash + run: | + echo "github env:" + echo "$GITHUB_DUMP" + - name: Build wheel packages if: ${{ ! contains(matrix.os, 'windows') }} - env: - GITHUB_DUMP: ${{ toJson(github) }} run: | - python -m build + python make.pyz beta-release -v touch .keepme + - name: "Publish beta package to pypi" + uses: pypa/gh-action-pypi-publish@release/v1 + if: ${{ matrix.python-version == env.XTARGET }} + with: + password: ${{ secrets.PYPI_API_TOKEN }} + - name: Archive artifacts uses: actions/upload-artifact@v4 with: diff --git a/health-checker.pyz b/health-checker.pyz index 28b96750c6fa539d0652196571d0e4d132faa58a..09828c944026e3160e6cd1ee27d5145730b00c77 100644 GIT binary patch literal 23296 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 literal 16259 zcmaL819T=^_C6fjwrwXJ+crA3Z6_Vuwv9J7I<{@6!;aZs-Z5-nHKI z>{ILPv#a*5^E`?&pkQb~e>5ZGZ<_!3@vjra@2icghrKhS;=lSp0WBJS(*!wyDD(ja z0=feM0)qc{A6rXjV+IFLUFCkeU?#ZkJ9Kq7Xk0NX_p0UXN7zmqRO$Zm1mPeQK#RWs zWnd$_qygW?H6IVJP*pjfeKIpsn;i>O<4Ox?5fmR47x9n*TjfyWX*X`ZY$Ohk{tl)HpB3j6map|WJVOz&si@O7FfKQDlr;T>ulXN636jHY$xBZmcbFB5m4VJnfcjx^_oX-#tBUEu`jC9+5^h zn7m|>f57_X8fpw2Vp9ai}Yuzui>x+eZlh zc9WrlC4-f-y^KAJq8L#65heJ^m$(aSBu(%@N3xebklmlIT$pn@WD z8@u4WT>UP7c{VHvE*(z`Q(u7_3F zb(Bv0vWD`Yq_rD2A({X!ejY!uT;LfJ-yu7?k-O%Ioj~Gv#swc`CTs+0@ z1*Z)w-I=P<)*ra-sgNiJJ7u&}r157UM5z=I5e|jr8WMInl!qjn34)Xl3|rxn%}O7U zK#h9B$=k@#@I?YQnm7W%=PbI}YTh)R-z5ecY(Q#s>}dwd(S`Ns|L+nS{5zfddjVk$mR?nZiaN`2IxURWFn+*%A<4Q*dm7P7Vd4 zx7#O-wPM;T#>U@_YSorufh2!<;Fg^)#$61#C=zy)a;s$hIL7_U&3{BA`fZXO7Zeas z7d8+O@?UOt_Ovs$cX0k4ku{n+_8VLneou9~G^gTM9qUa11#w*)rYR6`iYXCg1E4rV zCX^!w5*a-uDkt<-6?>Nex6Y;z`t;r%t__;6B0dpGRrXXg0pTHW}aRrZ-N zaR=%3c5%Pp#Po$v;dR=Ocj({Hth=;Vzu+jxNfc!A zW5^+%Wu>y?&T*HBul5mW_pF7JEL9r%@!~VTlS>KHMmip=V~v1v&*FAkqh*vE)Of5o zRe*WNZ{a7oQm$ue6mVy5Pvxlk)#;m78gAvRvgoNHwWaKUFTCoHYc~mSy3(`VMYY(j zL!;7?Zui!#dI?&Uo8@qZNJ`aGtKdH-K9rKpeKXZEdngo$j#kv|d;q)$PQ;!<$yrom zM(0C@1OhVBSsrik(E^+hQE(2sCa#+p^oDxj=|qR43elzES%>k`HtP2G_LUA_1-Use zka(JM9jmbqs1prL`>rWh-j>Ng6}< z`I+s3jTN#e*J2_j`*M+sP#=k~t~IQc+^g%536@ex;$w9maw1FCBdRC4ZM((OL!&{Y za!TBfHp)=i{W@km(gs3`Zp^K2y(Vx>1b<{?sz!cKc3l%?3jkYlAd>UhPVgCfR!fa= ziF|LBU~Ecq{e`3mlt?tW4iS5<-7fWTJlLOF7e(E<Yo0wzG%c| zcFjNc8XyIeuL+GQFuMG%=W>xstHeZpzMoe!8ZsO&#KrA-J9?JwK3E!pR}rx*csL8O zBUVKf*F{e(17kQ$=gHmO^QHI2&6nHsu52MM5YyxB#&AGh05&BUrGX!O+C(b3re+sv zA6igjphwV(G*AW-hc0lw0+PHFWVJT!Ww(Ke17hP$#JH&5F#b#e#@f7)qkPz8tT?gx z+#}~l3G@PY1PpUf!4N!sT8T1IK!7x9RnR(7DA+ej$e%4oIZyKra9d7ZLKBf0}% zdP62V+vS;(@n8X$29^DK_vx!T!8Dk&1Ks;8V-2WfNLOG+(PsbyJFW0Y`#8nN6tSH# zX*V4mZ=jdvOb+CN3);j-hiQIt4(p_ooG$W^;R{z!9@Da3pEp-IqA~vLGpD@=5;&B1 z!oCJdK`@fq>|hC-p)d!xBr1%iIaltmzIYMsO9tbwS&E&C@#ihU)j$ zs@PtvB_dl>MBPE>6W$GKtT2gGGqQAF+V|N2))Y1OF zjhZzzq#5~)RQ#$YY%^~FSQ+$yCVJim-$0Py3K(ESfL1B{&SRVQGe-j@fF{*ib;gHW z4>YWP>7EEEa-{Yse7ORAjPG6KI7L|%eELVT0No-u&+`E+kINd0GlzEW>2e=g%Mw`2 zKo<227wc*MlX5Eru~7OHDr=sisrv4dEw{Tg-DroM0f<)*7Gr6F2t787r@+UcoR z!$BY^`#pIb(SkNwn)uI;#s=ACW$Mb=yuP1nXffrgdk$6fCM&>%Mzch`Xr+$a>3L=l zGLQ~vWWl*bP_?3R?T42}g^o4q#Nh!YW%8HS+JHDenq5PLRH=%((lVU&bd|$2%8?^% zx21+JrqCP<90m&uf;Ve|E#=`23*VVPT@>31&E6xhc!E-y8^F8y?jJDjA#gvyk%7#n z2a5_Mo{pkpLrCFI8yXMG+Mu7AzarkgYo5j9lA~&>PGs;xKHDuk?a41LcBeF|_Ben$mRA%R-oUB4eFx&AcWtJgd)&i~)aJSqp23iavbZe|?=;TKS#~!i{&qi7%Fy zu8hcYS9UVw;n%{nAPU1rtQow?;71sNUv=XtHuU-UH3}0`zNg!9enXLDU7h{s{3bR^$%Ea4p6 zM3Q@5x+%~K48}uEt)4|+TH%-jUCyJ;TiOeWJH}^|`*AQjnT~6Yt|RL}4zvX%-tjS! z^C*dgCnyA&3-*v8@-|hHIC|tJwa@A#NDY7Tl$M!&MdU#K-4-Eg^Nw=tH^eX{y%qfe z!msO$A-9ePskIV1Y@EI8JhLXuYq!frb#HIZzY@R^UgI&`njixW0;()~>Mbdva&Xh^ zO-g}n*Fd&SXkpF?gJ@^)nEUtYpx%53pY({Yzf9*N{B-W2FH%+^AC?*H_u(YGxC{^&pZ>uN|Xo z(Sd4anTG02gg5cV+?f zJKz6D`zy`R*SEB@bkW!Uoo0Xn{Wkz-Gu5f$clt>R3IqiA8}`pi;*a#x!P8b*#(I+p zspm}t4h9^z<$Nn%Sdt-xOh?jgf~0AARNdP8E8jZ({fI^*J!iB4R7}kT+c18Ky4% zw-l9mtIEm_0e-$MK7p>{;mHw+#PJpMVwGNz@n-C~6`N>{pVfg1eTOz4p^aujC3+R2 zeb(h!G_+KUYoJ z`|1~PPtdxNFj6p9;-TGsL^KI-Ot73%jF#%uuG>gmI4Ta*2SI+Dh?A2h>Tm}t*^SE` zMYFTRL!D99FD2tIKmv2RqsE=GC0c+5Pv`dQ?2M$W#v)JV?H+6Dn1BY zABkyBf`ZIS?RECy4hII$45M>7R49cidb7x)c%>BJ7&`Rl9uIBQq2@9ici z#~;TDX&U2SJS^gdx2VIijALU~Lcdo;B?7hKk>l9>>a!xr64iH@1jAQcsFAthkuIZP+AywM%?DT8F3!SErOk#A-fiR6xJh zt|+V@&9yh6hz!bLZDGdFvTZumks%ttd9|Hh(=*Zi`EbPY!wwZ|rx?#qQu<1AiOLjH z#G}wp65xYo0xGInMJFGQP5st!0?RRK_aIpR^nF&&mI1)g6$5T`l^1B4vIb{~3U` zhL(2!2tXOy@fo#I>Y7o;WmQPOBmsH}HwZ7d6D`v-R@&MF57 z=r*?K$@>RF`?t5!>R(|5f%YvdK>ilOe>nQjnEzc}{40e2^!NWG_L0*pqtbpOMSp)n z!22Jd;UBe${y&}vzgIzss+|2M5mNUZt@zoHUb}iqQORY^O0Jhq4V_UOCmR;hu32l= z`x8rmRJJH}B0ZMbwokWVqgQB89!9U`g*OslZW&ZV+WRU*J+_9#T`73>$8GCEWJAQ{ zh8ufU2=4ZHVGc(uGe#@ZKA4*ldT{->vl53M&{x9j))9*Fu_n+0A8v%ZRiU=2w9TJu z-GEyo@oq4HlvOUgMDlwg`3;yr^T5M^Gco9B&N55HRU6?|&U4fp^TnRdpw;s$pSG*g zP@xW)u5Ml{g%I1Fv)VNL<}zKS?E1hMgLpLjjUyZsg02Hlc`7#jQ#y@M)cJ}y9A1?O zxhyKIk_3|BC=KStYQQ?Cy{l+>C&*#Dw*ztMU_&_6z8+5=5p<>Kosou(jvZWO!}{i| z_Qu*icG!@yz^Ugkq2;`n<7)M#WqF3&l_8x}9_ZSyM%bR8QszXszbE?X-M?p0zSRk`c*Xw4gvy<)`>M62#ADS)COK#Cw zuh|3g38Mw(bJq~o&ar#gpM_yJT3x7Gjh(Rh${?J0ZI9~!obTT!W2P5Awa?$?5tP;O zSqx(h>IA)PTmfX76_RYEWPS~3KbB!Jjo#kNfK|I};|oDvyCfj6d^#S}Ig?i4@U?HY ze*D|pFJ5CiM;!+UXxbGBi12?Fw1ugmjf;i8v4yFzwW-tZHGRov?YzO2xbr~kur8G# z&897tJGoUct#d>+{awwkn1qtuJ2Fx%Dt=0ogq~%WYTf*~ z5_D60{K^DvEl?Bcf@x%GKipwX2nOmglKhETm`Bm!OS8 zW?iloEBHgJVcH{2_YOoq*mDw7sceb6`}rU)=}sUh4fCW<;nN`OB3IHARxv(=Q+fU> zC%d-?sl=mP$q?A{lF~1IMv*%wTQ2wcThg~@Zc~MKa#ew@(6koOE?_r?{O#@VZOX{U zHlP^I9^`gE2@dh2o>l=dLNGQ3g48aQcNF{D=c<(RGpebvM+^2YJuYD5k=C-(c;! zWU2$@m!ps6c%ESYDgU>+d|6aHlMW zgsfQ}dpWx81RQ8kN~DeSPuxOE+M46N86r`RmRm1|5oprXyOv%5>cWCFr#uCJNA>H;?$gJO%H!`>^_uAU~Pm0uw{&_ zz=1D{z(&@Om=0cIKE`k|76!vx90dEAam4J@1OA6Q55f*>WlMNqEW7 zTxy&!I)F6{DJ_g4)V!EK#{!R}q%O)XaJ2k`Xr%!~g2z!Z14^}%L$=`2 z3=AwnXm}ye(qu(4N_pf&k_9G3K)T1o4F{63tDV6(+IJQpSzbIuWf?TKPvX!?mI6!J zYT%*!k-j6?X^nn#F6L}X;NBwuJ5BA{HwvUASr_!p;&v?(E|NX9@JP;Erinneb93QN zH86{mt$@Jcp?<-vO(41B^$NN4lieXPIrhXg1oc4OEIJ)fJ!k_X7z8I%7-`ih?eEP6 zIJcH$ndoaE_kf6GV34}?#d4CzLVDiHevv37O++fg=W>)#M5?`AC2~BrG$4j4jN_=U zB88n$m%A=f_L%l^PBAvFqqc^{Qnd+T2<q{YA5VPC9eBNv* zd}8xzK`0dNj%87rD-7G7i3~X(Kk#PH{@9nvL)huqeMaZ)9|m?zuPB^Zp3sPD3y5x< zFC@XE3y(pR#2LOJmr1leQ^vK)Y#q9%%(t}seDW6E27Btr$nusmTu6lzBSbwJi{fGg zxn~B=|4}3ohL>9X?U=%{AgkXVn9DuzM#;}7ds4-J8)KTGQzIVt=Xk_2o|%PGoh|pc z;~wI7Z?-Uu+Cl;^em7sXr#Yc~!^HAHqC!vmREFgVGW+t_$|+APBUn5od@@j#^ipjp z4v9Od2!Ts6tqy77-UV9a!-Ac;Ol>gzfuT%Dt`R6A>aUD20+Hschyxe36a3E45@vXh z6PEBFzwj9wu}a_QOhmgrpiYx1UC2vx7y?8aQ#cL>-hV|h}gPRDks;1K;mO~&Pi8*(7zHyYrw zioP(iz3*B(mGnQw>WcyXta##hIB?XR0p)sepC>ZnPaZ5Xr0L4328BOSxPqW93n{V- zYhGY3c-NXcgTk~hwqL}tIV~_50PL-0!>2f$tl~`Z)nNB?SC3}9q?cIA_-g4c;4b_+ z6=PlvQ2S*2tw!%q-p(F(bzO0-A3Yl6xJ2OvV6Sl*0}$7HP~94T1u*^8H## zj5e^f!h!e#4 z+s}2M1Qp)JZS42>9xOOy(bR$Z@ zU&ta79mr+tWh~-;_9r__DzEZcK#3n%JZY>Pt_9bW*qmVypWHfu1D^RzyUkx3$9HtU zBO)JQjH!j(=a}649*THN!Y8f{X$5FpOgeKfyu&a*K?6oO-^1)vt}#NTgqe)3NI}NN2z}8t+8TbdLsq*+Rp>_)ROCOM>BOAdrRDUqMYw76USB7w-^!z zY2)P5s4x@*`poks5?Re{Jw6BC9~)Iwv~{dbo%U}-QJA*vNIzzYOYaRkb_8(X5cE9N zHj4l%peuJ?dGlPi?O4PX@lBOF&Fld~-i`zei4Q1d=Sh2~D|=`Y>_31j7Od9%hoiXK zn>7MAl-1TT2#3a*LdTwu6p;LL5D&l23F@Ey;I%<7G#aE6E|$4WvzOnF-B?Vq#SaoE z$q(=%9c`65T0gn0OxsrvbdePq<1N=LsnlE4-g;T(@e$ECKOusilSNZ>H(2WUR9R|GZ-Vi_0qzn{p1Z)+r>7au9=a8oXM07^*nv|a^U7Rb~+7F~*$U%e&K@QXd z*^m~?JL{kc2Tt6B(<9_k_TA!ka9?IS5Hv$)C$@Nza$?`2msFflA|4gQi?gX$bq`6D zS(NRt19vX5`^UR5o4nook37*fZuNFPBWqK(+O<`0d>*dK-PLZOXkWv2iTSdI%r8B> z9o5|I==S2Wi3$13EQ4Z+y>tc1ed;AlyEBz&Vn8&RxH%?oqV|jo@~-qcYEo7tsHBAs zk@(P3XJ*}LfuTGhbCNT6+UvAM*<6)RQ#8a*P&Kqf5=#2oPNGPZ13Yv_cKA&zyjS3)S2nD zq%Fq*Jv&g;KIaQ4w1?#>%?hA7Eb+nBwh}ZVvGUK0X#j9I0~;)yL!@A(W%9yMHXuV6 zW*{H9=%0}A%d>r6LZpu}dx&aGOJHBW>u25JUB6&^7wvaQOy)7p*WaLTUqFWL^%%Z8JA2 zgSU3tXUmw{tsv%xol?D;CcV~3i}x&)$T)|BIf~67TZCd`Z_=4^V>kMM${USm6|kD) zFzlJi7m0tRbs^8?N;RAkr#DI0EMMD~GLd1`Okef^8L1vz!LKN5_O*IONMPiW+C2yL zO#VCLnK)E4Wj6yW?YMkxN4kb_Kp~mp{zS8QT99M8B_}+aJ44`r_P!07k+zs^f9{v= z%Z#mMbGxNHtp^WvM~G(EkoSH0bxl(av9%-*cJRrF6D2;-$WPYkb~%Wmvqkc`mr>4>J#@PIE@+!9RkDd2aGE-z%9p5_`G^-$!ZQZlb%(}PJzV@yWnBR?prsR zgdStox@?<t zZkdKsZkwj|tJlR!r4H@x*}XU`e&Wr~3>RJkwsE%n2)VEKlb;wWL7`3Y-Y`Cawdm82 zGlr#lXmFc;Kd^#rNI}N;(k(>hZLBHV>-R!=kcKl)y^ zPgq2ff^XO*HiAPo4#yJt&LtQfEadxUrBYz-x~5WvxuGsahgb;Rrag1Q3o8sK+ds>v zPZpmtz*MK%K?2G0}Yy>Zk?n`of4A3%9{}4&cwFGwQP@DF5Tc# zC}yM`-`KSl6qcb+5NXxuM+02`?yZmFdUG@P`&P zqkW+h>hj_X+{Xh<8+{uP^eM)Vt<*lYY*a(rCN3Z}WuB?%d=)cqVEg4ckrOD*h5cBH z*WMqe(DP&Y;S)C4jP^E|n;8l_OpY0h++PRaa4VhnPN1LZk}a z$Sb$(Se8dP1;q+gbi*6=NfbENrjO)Dr9e>S{;LXTTn;u{Y{%tsadC7Nd1W@_D+Hp>75dUb8mUXo1||W<=w-xwSFP(us2&kYLrJCll1BoBWe>(Ytuma> z0%o41R-;2K#^Ls?k0k2P8E>2SFM5U-He%T&l4ojwF&MVrJO%~h!@%{SPiVLjPXj%} zvI&JCFESo6>mE{0_Pp_>{Ja9M<0YAmcJe)fF~+4z!hU9V>d&$pIj0#K@0ne!leKBL zssIU=9kbadjKGOcX<5S(Y<%;z1q20_D`M(7{=;IUl!baH$1~l4`{!#q+17adVpPVY)(9hNdiIti+k-u$6GNvbtBcuoeK@@Mu)T!h4dH zgmz^!W;I@*2b~82C_L{ zIdjRZC84e0r{G1QZB>mjgtmwFAN<{!8_|z~xNbeV7Kw}k>K4r*7sPBo5M~I;zTCM@ zK!(?OfuDY|RO?;6z_&r}2tmv8|I(DRV6a4VE&uxS*&?Of!MiiIO@m9lgxwNJ<0B^_ zM?z}M_VX!eQC&kj!p{5li22iLv$W!xL{6ip%WLk@!U3hoSD({hxZ{vHy(}vH5qjw; z+U1?AL^F47W%Sx5!S{Ox2HWa}jGnOp6L=D{RBbzGowHwBq$B$welePMPRDtwaL_B!3; zD=&+JDbdfdvi7O9S61s=H*9wX;eEOVshv}cMIAliSe6$roo~~TSDJ6F^aeXdusFe0$(nBT;q2#4`LcnH z=OB~HK1(SuByYB?B$gF?0i0TdbVtnR!UVpfT@i%s-Q$Dbft=V6_p~V$CTOoer*3ACzkho zR$AF;f$vV*L=$7GqW)WpAx!TaZ&`k;8}1_q%sj)lnYw!Qw?{)dq#LK-_MJggI}P>K zh#BY6Q}HNwO`f^nlS`_!BkVtkc9zoKz0&Ss7uka&whVnqA1@)5pgzT&!fP%TlWDIe z6B999la+9SkQtd-92?^M1CDZR)$1S&c6DtQyC*47REQclNoo9S!7UK1XVL-9{H}&C zj6a<*l-G4Dw-F>DW5t)tf;M3{7a{$nsZtIF&u2c8 z<7vhMi{pq=6kW0kRA~I3N2!qY*!zYryx10L`m+bB`YCP}qbHg5L#wjblCIirp=sQE z7zXC67EBLhw6UbD{7EL-F=U^;k8K2f0dwvVuK3c^2uZgEb)_uly{?8tcFt{=#Lv9o zaq(jdOdhr%T}sp`*V;(zFX+%BL}%l>U-Y;~dv{MHEaXO+2;o0=8i|6K!xkqxY&IT# znT@P;Z!%ZJ>10|(m}$2T%JB3Tg}&{9Q!3o3pW4J|Jk?k6gz8p}#0DCs`u0m)ZnP}I zWZGZti3D1Zj>_ks0i`JJAQf952L)(jjBXr*ef|Re@BLu&z}M8$-_+jkj6gsb|Fb3a z=kDqe&W6)w%Y$z(h)A5orrA`(0)( zG_W8DnX7eHn!2$J8C3QgJY>0cv!SQn=0@YxQYE146vF`?&@{7ij zFV%gD|GQe%umEm5@~2kSeiYMZje1pzjXM6WTk}!P6~zQS`EtY32RSE^+-`>7y7T&G4*5sb{C*zB)8_<3shX8++Eimu7Mwa)|4Le z8rB>~*L1VRc$cQF3F&&5Vivr;bZBs<nd!1|`f6qS-JG+$Tp0quOph&LX@}SEAJ!k@1n#(He~Sa$8me2>IpZ z<@EgYet!{G6nuSRz{+N$v>#__|Ar|OhA|94_U#YB_Ho&n4^UH7g*%v?=NIw-n`%fe zrP8KddVyN55Ns}#H%1o#Lqi|^!R@-hI)_$?c7}C>ScvpfT6DOtT1+AMnu31qs0O*q z_QjSvuJmi2DgCNeCu)NxpST{&5|s8dR~wEL&Z*f-AEEs!ds?VkB{@o_t}ZK+Oud+$ zYL=WJn{@^DJ7~rYEx8Ox!1k#j7k$AouvkSV-(U~hInHke?pH(~4;Txgcx!0UuP{!8 z=E^lxwe#(7%7a)N?BdIl5+Ro1UbHY;Qc58DSuzfiY6*Dv>2(QeuX%~M2=kPDsOZAs#ugPEr{Q%uHudnohMqdex6 zA&QUIg(QUrV^HgK8i4k#vb)u!^qzTwV!E#8MiSCSp`dONC4!6j zl#pV}n_SXnl=H^$2|E?kGsUzcg{&ev=Y56$t_OHdg%X zlE1z8SIHW{=;}z1T!OQ3HKEMqC2e>0yQDQcoE8xk2z8i!Xe-iN0O%RpI| z3-|1q5w8Wso5g*h2jrL-ClfDQZQUNhK<3nwvs=!&Eg4rf^$~v^T(s{6^NU{;yJ_oF zTa2kx?e-n&kJT6VAy|?F-xq5dg!6z>xg-0BjRNUkhvfGKdy^hRcV-ug#E47@rPJ{D z;wg<~91L6X0v&ZZxPpZOq~vE1ru}&3LI)e+!d{Wsrp3|9j4W&92LCRou#Z{xuu;5gWX9aV@Gl7W9~O^+Z8VeeuJ!GV_l&u&?whQP;bE~ zYI43&P~!X9sYE_0SzE_1iP^~nj`zJJowI0!&HT@=zi4>$JE7!&(KrsUE}hC(gmOz$ zf_^SaudZ5#eW74a4b3hdv01@b-;NLBrUqOVMqDoMrf>iFML;IA8{^ zVTeCRxJf&5v?Td+iK%UixZeAlT{}oYgkeYki%@8JV1oR~ssxMmWctS36>@!ded*l; zUXPcQx9;1w;2@7;D5yJQVXVY4JZ$Zr>f9_u%QaQ*Z=8MZUM^lA&Q;TpH zeh#$hHZPZxuPeHGUxrHwm_`hq;Lk?gwPF(NyUTNVm$_ZtzVVqS_CIz@u-#FxF-h`( zLq8e3cDa2On>CE0=g@KPbie@Dan+d`^b^C#uEeufB50=Tl#O}oC-W23|N;Zq(FEZ4XYFV7ZpQXd-kO;)^|R=bQ^}jQ&p5DJLQD<-0qY-|cp*`D~J zQ&wx27Bm!f7yHdQFOKg-cl^e(vP#oAP17|V7!g#jp$Grx1g8gAGjxF8mK3cfaHAkm!1vX6tb}3l$*6q{oIcQYNAG%;mkkGX*ef zI16MF;w%2H#m`d>e81|;2>P`oVMcT0#9iYcV^G6F1Ek^s4DTZ` z4q9G#N>WG;_^P1HUkP7%Mh`~qN%J-&Rti}hVL8*=e8@oIl@&JIe&9ln6;#D%*Sm~9 z42*!><0rQ-JzB$yLGj1(xTCSYM$ask?CpxE8`rtky9FA-jd~4D%Wvo9ubQ~ZY^XgXA8K0T{|r7fDMOTx0|--?bk~tZV89pAaBIiCS!HM`f*y6>0Y@?u1cI37VR4ZFNmA~wjR)= zm$22jfQhUwGUG5qc~-LDRf)pVNNEZ0Zf;^9tgDcW!@3uyl7&Oc(+C5ba$sEq|17jV z#DN98f6L?{@wS}-z?Q3+%tJPZyy9tI+h{`T2rvmAO^aym9*i5gfEy^48Nd(?HS8ah zPvW#M$C{uPA&;7dO(pcGA+D+w>(-@+FS0ciPRavCY`Vc>tFF%tT9U#D7^kOrF+n~h z588|gzIm?Ym=Lvdg|HORG)nN#2LbN_kCDZd4Kf7ZKNc7#K4mu zc-a)Sa%ZNCkis0NeedUBA?2_&`nCJ_S07+$%o~FKb3JJKWdnk11vhd~U>l)&#y-z6 zxrS*OrMnHx(*tabdjg?Gnb~hh@T6?<1D|rHv*dYX#UdiA1xiqMiqGHX!ZA6nlzGSC z!M-ItMTF`vb7ZjZuWu6@A?KUV4T1Jan(D?`(19Eow^>&IIk<|InhUnEU7vz-RVTpDlvW}KS}t% z-15kNfX!zxqf_dTE5!g4Qaf1Q_ z9^?U^;N*EloQDG?p4Gd4>$08Fi%o$hV1s&%E7^tZBY%tudJE3!!>&0{_s(F5d}$ z7KNO3-rOs`N9>YD_F8O;N=?AFSDJC&pDzH?@3c`#s})&GE$$H9q_8n=;81BP#MfmA zX%1z<9I)R(-8^Cmct*Q8OBJsl4TiDTzfVn}$Wx_4jtB2TzNkgq1M`5P=>vpwwbOMh z;Hrt`DY5yA!_a~UVHS(*f*5FK2JeC6t8pzKBV(&SyYL`E+9F2QlG9tVZBVVImy2Um zTyuUA3N~gk1CW(}buplycCR!%HYi>{jXm8d5^QYz)&g@q2B+i47RK$U zLpFx3;UTT5>66Y*@6su9GQuqOUu*^|xzck=F`6hDf~l<%9i+A|HAXDh)R!#U$bI<-qjs4BJc0|(U-+JBR{ z5;yl?&&FVLFn48U?_re4Z9rY^+?8!@nuLBdRBiwktKcAL4u0-nxT$gzy~Tipu*pv@ zjQf+{xM_4`xbI}GRmFX`g?=%17fqlO*WZ26GzU@kYa{8&Vl&c)OPh@kW-A6STDpSd zRcu8Yb1Gn!i4uDRYaUs|e2M2;PVLX=PGkK1cN@SHzExEbqg zZEv=G%{8wC^|2M~1MSXT@UQKdZ zVQf;SRhf!jYM~h@!olM&XT5c3B*C8jAxGTIN*Vv6Hrlkb$~#T4dc7>;{M zixYB_lMAzlf3SRkLC`?||3$yQ$Nb%pfG&mpxc-y4{}<-}76Jd!^N&^>NcQ{uPt3n0 z!T$;Uzl5p(!2JU{@tZLIPw1aA)&Io)Uuws{u#LZU2LHnTrG5N6{EzN`GMfJ&QUBSB z1F?T=6#fbS4_@=%;eXdO`~{c(H~gOphrf{jH+BA>$UmkS|2LEVp9B9%to{r8&#C@9 zmHw|$rT&fmFJk@Q4g8%t{+EGF#6JiBk45%(_#fT>oU}h^;D5H_KzO7-;eX!y|6}t0 zP743ajQIbU`EQE&-*4#eY}~&rVg8mH{P$%34>$Mk#{T{tG#&^zp&~ diff --git a/luxos.pyz b/luxos.pyz index 92324c69f827f977b09c8045235943382aebb178..8e042f78c05166d4780927f17b0759aeb2da7f39 100644 GIT binary patch literal 23283 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 ak86OM67mm=H5@kVH3CzMJ<|R0?SBA)+*W-6 literal 16246 zcmaL819T=^_C6fjwrwXJ+crA3Z6_Vuwv9J7I<{@6!;aZs-Z5-nHKI z>{ILPv#a*5^E`?&pkQb~e>5ZGZ<_!3@vjra@2icghrKhS;=lSp0WBJS(*!wyDD(ja z0=feM0)qc{A6rXjV+IFLUFCkeU?#ZkJ9Kq7Xk0NX_p0UXN7zmqRO$Zm1mPeQK#RWs zWnd$_qygW?H6IVJP*pjfeKIpsn;i>O<4Ox?5fmR47x9n*TjfyWX*X`ZY$Ohk{tl)HpB3j6map|WJVOz&si@O7FfKQDlr;T>ulXN636jHY$xBZmcbFB5m4VJnfcjx^_oX-#tBUEu`jC9+5^h zn7m|>f57_X8fpw2Vp9ai}Yuzui>x+eZlh zc9WrlC4-f-y^KAJq8L#65heJ^m$(aSBu(%@N3xebklmlIT$pn@WD z8@u4WT>UP7c{VHvE*(z`Q(u7_3F zb(Bv0vWD`Yq_rD2A({X!ejY!uT;LfJ-yu7?k-O%Ioj~Gv#swc`CTs+0@ z1*Z)w-I=P<)*ra-sgNiJJ7u&}r157UM5z=I5e|jr8WMInl!qjn34)Xl3|rxn%}O7U zK#h9B$=k@#@I?YQnm7W%=PbI}YTh)R-z5ecY(Q#s>}dwd(S`Ns|L+nS{5zfddjVk$mR?nZiaN`2IxURWFn+*%A<4Q*dm7P7Vd4 zx7#O-wPM;T#>U@_YSorufh2!<;Fg^)#$61#C=zy)a;s$hIL7_U&3{BA`fZXO7Zeas z7d8+O@?UOt_Ovs$cX0k4ku{n+_8VLneou9~G^gTM9qUa11#w*)rYR6`iYXCg1E4rV zCX^!w5*a-uDkt<-6?>Nex6Y;z`t;r%t__;6B0dpGRrXXg0pTHW}aRrZ-N zaR=%3c5%Pp#Po$v;dR=Ocj({Hth=;Vzu+jxNfc!A zW5^+%Wu>y?&T*HBul5mW_pF7JEL9r%@!~VTlS>KHMmip=V~v1v&*FAkqh*vE)Of5o zRe*WNZ{a7oQm$ue6mVy5Pvxlk)#;m78gAvRvgoNHwWaKUFTCoHYc~mSy3(`VMYY(j zL!;7?Zui!#dI?&Uo8@qZNJ`aGtKdH-K9rKpeKXZEdngo$j#kv|d;q)$PQ;!<$yrom zM(0C@1OhVBSsrik(E^+hQE(2sCa#+p^oDxj=|qR43elzES%>k`HtP2G_LUA_1-Use zka(JM9jmbqs1prL`>rWh-j>Ng6}< z`I+s3jTN#e*J2_j`*M+sP#=k~t~IQc+^g%536@ex;$w9maw1FCBdRC4ZM((OL!&{Y za!TBfHp)=i{W@km(gs3`Zp^K2y(Vx>1b<{?sz!cKc3l%?3jkYlAd>UhPVgCfR!fa= ziF|LBU~Ecq{e`3mlt?tW4iS5<-7fWTJlLOF7e(E<Yo0wzG%c| zcFjNc8XyIeuL+GQFuMG%=W>xstHeZpzMoe!8ZsO&#KrA-J9?JwK3E!pR}rx*csL8O zBUVKf*F{e(17kQ$=gHmO^QHI2&6nHsu52MM5YyxB#&AGh05&BUrGX!O+C(b3re+sv zA6igjphwV(G*AW-hc0lw0+PHFWVJT!Ww(Ke17hP$#JH&5F#b#e#@f7)qkPz8tT?gx z+#}~l3G@PY1PpUf!4N!sT8T1IK!7x9RnR(7DA+ej$e%4oIZyKra9d7ZLKBf0}% zdP62V+vS;(@n8X$29^DK_vx!T!8Dk&1Ks;8V-2WfNLOG+(PsbyJFW0Y`#8nN6tSH# zX*V4mZ=jdvOb+CN3);j-hiQIt4(p_ooG$W^;R{z!9@Da3pEp-IqA~vLGpD@=5;&B1 z!oCJdK`@fq>|hC-p)d!xBr1%iIaltmzIYMsO9tbwS&E&C@#ihU)j$ zs@PtvB_dl>MBPE>6W$GKtT2gGGqQAF+V|N2))Y1OF zjhZzzq#5~)RQ#$YY%^~FSQ+$yCVJim-$0Py3K(ESfL1B{&SRVQGe-j@fF{*ib;gHW z4>YWP>7EEEa-{Yse7ORAjPG6KI7L|%eELVT0No-u&+`E+kINd0GlzEW>2e=g%Mw`2 zKo<227wc*MlX5Eru~7OHDr=sisrv4dEw{Tg-DroM0f<)*7Gr6F2t787r@+UcoR z!$BY^`#pIb(SkNwn)uI;#s=ACW$Mb=yuP1nXffrgdk$6fCM&>%Mzch`Xr+$a>3L=l zGLQ~vWWl*bP_?3R?T42}g^o4q#Nh!YW%8HS+JHDenq5PLRH=%((lVU&bd|$2%8?^% zx21+JrqCP<90m&uf;Ve|E#=`23*VVPT@>31&E6xhc!E-y8^F8y?jJDjA#gvyk%7#n z2a5_Mo{pkpLrCFI8yXMG+Mu7AzarkgYo5j9lA~&>PGs;xKHDuk?a41LcBeF|_Ben$mRA%R-oUB4eFx&AcWtJgd)&i~)aJSqp23iavbZe|?=;TKS#~!i{&qi7%Fy zu8hcYS9UVw;n%{nAPU1rtQow?;71sNUv=XtHuU-UH3}0`zNg!9enXLDU7h{s{3bR^$%Ea4p6 zM3Q@5x+%~K48}uEt)4|+TH%-jUCyJ;TiOeWJH}^|`*AQjnT~6Yt|RL}4zvX%-tjS! z^C*dgCnyA&3-*v8@-|hHIC|tJwa@A#NDY7Tl$M!&MdU#K-4-Eg^Nw=tH^eX{y%qfe z!msO$A-9ePskIV1Y@EI8JhLXuYq!frb#HIZzY@R^UgI&`njixW0;()~>Mbdva&Xh^ zO-g}n*Fd&SXkpF?gJ@^)nEUtYpx%53pY({Yzf9*N{B-W2FH%+^AC?*H_u(YGxC{^&pZ>uN|Xo z(Sd4anTG02gg5cV+?f zJKz6D`zy`R*SEB@bkW!Uoo0Xn{Wkz-Gu5f$clt>R3IqiA8}`pi;*a#x!P8b*#(I+p zspm}t4h9^z<$Nn%Sdt-xOh?jgf~0AARNdP8E8jZ({fI^*J!iB4R7}kT+c18Ky4% zw-l9mtIEm_0e-$MK7p>{;mHw+#PJpMVwGNz@n-C~6`N>{pVfg1eTOz4p^aujC3+R2 zeb(h!G_+KUYoJ z`|1~PPtdxNFj6p9;-TGsL^KI-Ot73%jF#%uuG>gmI4Ta*2SI+Dh?A2h>Tm}t*^SE` zMYFTRL!D99FD2tIKmv2RqsE=GC0c+5Pv`dQ?2M$W#v)JV?H+6Dn1BY zABkyBf`ZIS?RECy4hII$45M>7R49cidb7x)c%>BJ7&`Rl9uIBQq2@9ici z#~;TDX&U2SJS^gdx2VIijALU~Lcdo;B?7hKk>l9>>a!xr64iH@1jAQcsFAthkuIZP+AywM%?DT8F3!SErOk#A-fiR6xJh zt|+V@&9yh6hz!bLZDGdFvTZumks%ttd9|Hh(=*Zi`EbPY!wwZ|rx?#qQu<1AiOLjH z#G}wp65xYo0xGInMJFGQP5st!0?RRK_aIpR^nF&&mI1)g6$5T`l^1B4vIb{~3U` zhL(2!2tXOy@fo#I>Y7o;WmQPOBmsH}HwZ7d6D`v-R@&MF57 z=r*?K$@>RF`?t5!>R(|5f%YvdK>ilOe>nQjnEzc}{40e2^!NWG_L0*pqtbpOMSp)n z!22Jd;UBe${y&}vzgIzss+|2M5mNUZt@zoHUb}iqQORY^O0Jhq4V_UOCmR;hu32l= z`x8rmRJJH}B0ZMbwokWVqgQB89!9U`g*OslZW&ZV+WRU*J+_9#T`73>$8GCEWJAQ{ zh8ufU2=4ZHVGc(uGe#@ZKA4*ldT{->vl53M&{x9j))9*Fu_n+0A8v%ZRiU=2w9TJu z-GEyo@oq4HlvOUgMDlwg`3;yr^T5M^Gco9B&N55HRU6?|&U4fp^TnRdpw;s$pSG*g zP@xW)u5Ml{g%I1Fv)VNL<}zKS?E1hMgLpLjjUyZsg02Hlc`7#jQ#y@M)cJ}y9A1?O zxhyKIk_3|BC=KStYQQ?Cy{l+>C&*#Dw*ztMU_&_6z8+5=5p<>Kosou(jvZWO!}{i| z_Qu*icG!@yz^Ugkq2;`n<7)M#WqF3&l_8x}9_ZSyM%bR8QszXszbE?X-M?p0zSRk`c*Xw4gvy<)`>M62#ADS)COK#Cw zuh|3g38Mw(bJq~o&ar#gpM_yJT3x7Gjh(Rh${?J0ZI9~!obTT!W2P5Awa?$?5tP;O zSqx(h>IA)PTmfX76_RYEWPS~3KbB!Jjo#kNfK|I};|oDvyCfj6d^#S}Ig?i4@U?HY ze*D|pFJ5CiM;!+UXxbGBi12?Fw1ugmjf;i8v4yFzwW-tZHGRov?YzO2xbr~kur8G# z&897tJGoUct#d>+{awwkn1qtuJ2Fx%Dt=0ogq~%WYTf*~ z5_D60{K^DvEl?Bcf@x%GKipwX2nOmglKhETm`Bm!OS8 zW?iloEBHgJVcH{2_YOoq*mDw7sceb6`}rU)=}sUh4fCW<;nN`OB3IHARxv(=Q+fU> zC%d-?sl=mP$q?A{lF~1IMv*%wTQ2wcThg~@Zc~MKa#ew@(6koOE?_r?{O#@VZOX{U zHlP^I9^`gE2@dh2o>l=dLNGQ3g48aQcNF{D=c<(RGpebvM+^2YJuYD5k=C-(c;! zWU2$@m!ps6c%ESYDgU>+d|6aHlMW zgsfQ}dpWx81RQ8kN~DeSPuxOE+M46N86r`RmRm1|5oprXyOv%5>cWCFr#uCJNA>H;?$gJO%H!`>^_uAU~Pm0uw{&_ zz=1D{z(&@Om=0cIKE`k|76!vx90dEAam4J@1OA6Q55f*>WlMNqEW7 zTxy&!I)F6{DJ_g4)V!EK#{!R}q%O)XaJ2k`Xr%!~g2z!Z14^}%L$=`2 z3=AwnXm}ye(qu(4N_pf&k_9G3K)T1o4F{63tDV6(+IJQpSzbIuWf?TKPvX!?mI6!J zYT%*!k-j6?X^nn#F6L}X;NBwuJ5BA{HwvUASr_!p;&v?(E|NX9@JP;Erinneb93QN zH86{mt$@Jcp?<-vO(41B^$NN4lieXPIrhXg1oc4OEIJ)fJ!k_X7z8I%7-`ih?eEP6 zIJcH$ndoaE_kf6GV34}?#d4CzLVDiHevv37O++fg=W>)#M5?`AC2~BrG$4j4jN_=U zB88n$m%A=f_L%l^PBAvFqqc^{Qnd+T2<q{YA5VPC9eBNv* zd}8xzK`0dNj%87rD-7G7i3~X(Kk#PH{@9nvL)huqeMaZ)9|m?zuPB^Zp3sPD3y5x< zFC@XE3y(pR#2LOJmr1leQ^vK)Y#q9%%(t}seDW6E27Btr$nusmTu6lzBSbwJi{fGg zxn~B=|4}3ohL>9X?U=%{AgkXVn9DuzM#;}7ds4-J8)KTGQzIVt=Xk_2o|%PGoh|pc z;~wI7Z?-Uu+Cl;^em7sXr#Yc~!^HAHqC!vmREFgVGW+t_$|+APBUn5od@@j#^ipjp z4v9Od2!Ts6tqy77-UV9a!-Ac;Ol>gzfuT%Dt`R6A>aUD20+Hschyxe36a3E45@vXh z6PEBFzwj9wu}a_QOhmgrpiYx1UC2vx7y?8aQ#cL>-hV|h}gPRDks;1K;mO~&Pi8*(7zHyYrw zioP(iz3*B(mGnQw>WcyXta##hIB?XR0p)sepC>ZnPaZ5Xr0L4328BOSxPqW93n{V- zYhGY3c-NXcgTk~hwqL}tIV~_50PL-0!>2f$tl~`Z)nNB?SC3}9q?cIA_-g4c;4b_+ z6=PlvQ2S*2tw!%q-p(F(bzO0-A3Yl6xJ2OvV6Sl*0}$7HP~94T1u*^8H## zj5e^f!h!e#4 z+s}2M1Qp)JZS42>9xOOy(bR$Z@ zU&ta79mr+tWh~-;_9r__DzEZcK#3n%JZY>Pt_9bW*qmVypWHfu1D^RzyUkx3$9HtU zBO)JQjH!j(=a}649*THN!Y8f{X$5FpOgeKfyu&a*K?6oO-^1)vt}#NTgqe)3NI}NN2z}8t+8TbdLsq*+Rp>_)ROCOM>BOAdrRDUqMYw76USB7w-^!z zY2)P5s4x@*`poks5?Re{Jw6BC9~)Iwv~{dbo%U}-QJA*vNIzzYOYaRkb_8(X5cE9N zHj4l%peuJ?dGlPi?O4PX@lBOF&Fld~-i`zei4Q1d=Sh2~D|=`Y>_31j7Od9%hoiXK zn>7MAl-1TT2#3a*LdTwu6p;LL5D&l23F@Ey;I%<7G#aE6E|$4WvzOnF-B?Vq#SaoE z$q(=%9c`65T0gn0OxsrvbdePq<1N=LsnlE4-g;T(@e$ECKOusilSNZ>H(2WUR9R|GZ-Vi_0qzn{p1Z)+r>7au9=a8oXM07^*nv|a^U7Rb~+7F~*$U%e&K@QXd z*^m~?JL{kc2Tt6B(<9_k_TA!ka9?IS5Hv$)C$@Nza$?`2msFflA|4gQi?gX$bq`6D zS(NRt19vX5`^UR5o4nook37*fZuNFPBWqK(+O<`0d>*dK-PLZOXkWv2iTSdI%r8B> z9o5|I==S2Wi3$13EQ4Z+y>tc1ed;AlyEBz&Vn8&RxH%?oqV|jo@~-qcYEo7tsHBAs zk@(P3XJ*}LfuTGhbCNT6+UvAM*<6)RQ#8a*P&Kqf5=#2oPNGPZ13Yv_cKA&zyjS3)S2nD zq%Fq*Jv&g;KIaQ4w1?#>%?hA7Eb+nBwh}ZVvGUK0X#j9I0~;)yL!@A(W%9yMHXuV6 zW*{H9=%0}A%d>r6LZpu}dx&aGOJHBW>u25JUB6&^7wvaQOy)7p*WaLTUqFWL^%%Z8JA2 zgSU3tXUmw{tsv%xol?D;CcV~3i}x&)$T)|BIf~67TZCd`Z_=4^V>kMM${USm6|kD) zFzlJi7m0tRbs^8?N;RAkr#DI0EMMD~GLd1`Okef^8L1vz!LKN5_O*IONMPiW+C2yL zO#VCLnK)E4Wj6yW?YMkxN4kb_Kp~mp{zS8QT99M8B_}+aJ44`r_P!07k+zs^f9{v= z%Z#mMbGxNHtp^WvM~G(EkoSH0bxl(av9%-*cJRrF6D2;-$WPYkb~%Wmvqkc`mr>4>J#@PIE@+!9RkDd2aGE-z%9p5_`G^-$!ZQZlb%(}PJzV@yWnBR?prsR zgdStox@?<t zZkdKsZkwj|tJlR!r4H@x*}XU`e&Wr~3>RJkwsE%n2)VEKlb;wWL7`3Y-Y`Cawdm82 zGlr#lXmFc;Kd^#rNI}N;(k(>hZLBHV>-R!=kcKl)y^ zPgq2ff^XO*HiAPo4#yJt&LtQfEadxUrBYz-x~5WvxuGsahgb;Rrag1Q3o8sK+ds>v zPZpmtz*MK%K?2G0}Yy>Zk?n`of4A3%9{}4&cwFGwQP@DF5Tc# zC}yM`-`KSl6qcb+5NXxuM+02`?yZmFdUG@P`&P zqkW+h>hj_X+{Xh<8+{uP^eM)Vt<*lYY*a(rCN3Z}WuB?%d=)cqVEg4ckrOD*h5cBH z*WMqe(DP&Y;S)C4jP^E|n;8l_OpY0h++PRaa4VhnPN1LZk}a z$Sb$(Se8dP1;q+gbi*6=NfbENrjO)Dr9e>S{;LXTTn;u{Y{%tsadC7Nd1W@_D+Hp>75dUb8mUXo1||W<=w-xwSFP(us2&kYLrJCll1BoBWe>(Ytuma> z0%o41R-;2K#^Ls?k0k2P8E>2SFM5U-He%T&l4ojwF&MVrJO%~h!@%{SPiVLjPXj%} zvI&JCFESo6>mE{0_Pp_>{Ja9M<0YAmcJe)fF~+4z!hU9V>d&$pIj0#K@0ne!leKBL zssIU=9kbadjKGOcX<5S(Y<%;z1q20_D`M(7{=;IUl!baH$1~l4`{!#q+17adVpPVY)(9hNdiIti+k-u$6GNvbtBcuoeK@@Mu)T!h4dH zgmz^!W;I@*2b~82C_L{ zIdjRZC84e0r{G1QZB>mjgtmwFAN<{!8_|z~xNbeV7Kw}k>K4r*7sPBo5M~I;zTCM@ zK!(?OfuDY|RO?;6z_&r}2tmv8|I(DRV6a4VE&uxS*&?Of!MiiIO@m9lgxwNJ<0B^_ zM?z}M_VX!eQC&kj!p{5li22iLv$W!xL{6ip%WLk@!U3hoSD({hxZ{vHy(}vH5qjw; z+U1?AL^F47W%Sx5!S{Ox2HWa}jGnOp6L=D{RBbzGowHwBq$B$welePMPRDtwaL_B!3; zD=&+JDbdfdvi7O9S61s=H*9wX;eEOVshv}cMIAliSe6$roo~~TSDJ6F^aeXdusFe0$(nBT;q2#4`LcnH z=OB~HK1(SuByYB?B$gF?0i0TdbVtnR!UVpfT@i%s-Q$Dbft=V6_p~V$CTOoer*3ACzkho zR$AF;f$vV*L=$7GqW)WpAx!TaZ&`k;8}1_q%sj)lnYw!Qw?{)dq#LK-_MJggI}P>K zh#BY6Q}HNwO`f^nlS`_!BkVtkc9zoKz0&Ss7uka&whVnqA1@)5pgzT&!fP%TlWDIe z6B999la+9SkQtd-92?^M1CDZR)$1S&c6DtQyC*47REQclNoo9S!7UK1XVL-9{H}&C zj6a<*l-G4Dw-F>DW5t)tf;M3{7a{$nsZtIF&u2c8 z<7vhMi{pq=6kW0kRA~I3N2!qY*!zYryx10L`m+bB`YCP}qbHg5L#wjblCIirp=sQE z7zXC67EBLhw6UbD{7EL-F=U^;k8K2f0dwvVuK3c^2uZgEb)_uly{?8tcFt{=#Lv9o zaq(jdOdhr%T}sp`*V;(zFX+%BL}%l>U-Y;~dv{MHEaXO+2;o0=8i|6K!xkqxY&IT# znT@P;Z!%ZJ>10|(m}$2T%JB3Tg}&{9Q!3o3pW4J|Jk?k6gz8p}#0DCs`u0m)ZnP}I zWZGZti3D1Zj>_ks0i`JJAQf952L)(jjBXr*ef|Re@BLu&z}M8$-_+jkj6gsb|Fb3a z=kDqe&W6)w%Y$z(h)A5orrA`(0)( zG_W8DnX7eHn!2$J8C3QgJY>0cv!SQn=0@YxQYE146vF`?&@{7ij zFV%gD|GQe%umEm5@~2kSeiYMZje1pzjXM6WTk}!P6~zQS`EtY32RSE^+-`>7y7T&G4*5sb{C*zB)8_<3shX8++Eimu7Mwa)|4Le z8rB>~*L1VRc$cQF3F&&5Vivr;bZBs<nd!1|`f6qS-JG+$Tp0quOph&LX@}SEAJ!k@1n#(He~Sa$8me2>IpZ z<@EgYet!{G6nuSRz{+N$v>#__|Ar|OhA|94_U#YB_Ho&n4^UH7g*%v?=NIw-n`%fe zrP8KddVyN55Ns}#H%1o#Lqi|^!R@-hI)_$?c7}C>ScvpfT6DOtT1+AMnu31qs0O*q z_QjSvuJmi2DgCNeCu)NxpST{&5|s8dR~wEL&Z*f-AEEs!ds?VkB{@o_t}ZK+Oud+$ zYL=WJn{@^DJ7~rYEx8Ox!1k#j7k$AouvkSV-(U~hInHke?pH(~4;Txgcx!0UuP{!8 z=E^lxwe#(7%7a)N?BdIl5+Ro1UbHY;Qc58DSuzfiY6*Dv>2(QeuX%~M2=kPDsOZAs#ugPEr{Q%uHudnohMqdex6 zA&QUIg(QUrV^HgK8i4k#vb)u!^qzTwV!E#8MiSCSp`dONC4!6j zl#pV}n_SXnl=H^$2|E?kGsUzcg{&ev=Y56$t_OHdg%X zlE1z8SIHW{=;}z1T!OQ3HKEMqC2e>0yQDQcoE8xk2z8i!Xe-iN0O%RpI| z3-|1q5w8Wso5g*h2jrL-ClfDQZQUNhK<3nwvs=!&Eg4rf^$~v^T(s{6^NU{;yJ_oF zTa2kx?e-n&kJT6VAy|?F-xq5dg!6z>xg-0BjRNUkhvfGKdy^hRcV-ug#E47@rPJ{D z;wg<~91L6X0v&ZZxPpZOq~vE1ru}&3LI)e+!d{Wsrp3|9j4W&92LCRou#Z{xuu;5gWX9aV@Gl7W9~O^+Z8VeeuJ!GV_l&u&?whQP;bE~ zYI43&P~!X9sYE_0SzE_1iP^~nj`zJJowI0!&HT@=zi4>$JE7!&(KrsUE}hC(gmOz$ zf_^SaudZ5#eW74a4b3hdv01@b-;NLBrUqOVMqDoMrf>iFML;IA8{^ zVTeCRxJf&5v?Td+iK%UixZeAlT{}oYgkeYki%@8JV1oR~ssxMmWctS36>@!ded*l; zUXPcQx9;1w;2@7;D5yJQVXVY4JZ$Zr>f9_u%QaQ*Z=8MZUM^lA&Q;TpH zeh#$hHZPZxuPeHGUxrHwm_`hq;Lk?gwPF(NyUTNVm$_ZtzVVqS_CIz@u-#FxF-h`( zLq8e3cDa2On>CE0=g@KPbie@Dan+d`^b^C#uEeufB50=Tl#O}oC-W23|N;Zq(FEZ4XYFV7ZpQXd-kO;)^|R=bQ^}jQ&p5DJLQD<-0qY-|cp*`D~J zQ&wx27Bm!f7yHdQFOKg-cl^e(vP#oAP17|V7!g#jp$Grx1g8gAGjxF8mK3cfaHAkm!1vX6tb}3l$*6q{oIcQYNAG%;mkkGX*ef zI16MF;w%2H#m`d>e81|;2>P`oVMcT0#9iYcV^G6F1Ek^s4DTZ` z4q9G#N>WG;_^P1HUkP7%Mh`~qN%J-&Rti}hVL8*=e8@oIl@&JIe&9ln6;#D%*Sm~9 z42*!><0rQ-JzB$yLGj1(xTCSYM$ask?CpxE8`rtky9FA-jd~4D%Wvo9ubQ~ZY^XgXA8K0T{|r7fDMOTx0|--?bk~tZV89pAaBIiCS!HM`f*y6>0Y@?u1cI37VR4ZFNmA~wjR)= zm$22jfQhUwGUG5qc~-LDRf)pVNNEZ0Zf;^9tgDcW!@3uyl7&Oc(+C5ba$sEq|17jV z#DN98f6L?{@wS}-z?Q3+%tJPZyy9tI+h{`T2rvmAO^aym9*i5gfEy^48Nd(?HS8ah zPvW#M$C{uPA&;7dO(pcGA+D+w>(-@+FS0ciPRavCY`Vc>tFF%tT9U#D7^kOrF+n~h z588|gzIm?Ym=Lvdg|HORG)nN#2LbN_kCDZd4Kf7ZKNc7#K4mu zc-a)Sa%ZNCkis0NeedUBA?2_&`nCJ_S07+$%o~FKb3JJKWdnk11vhd~U>l)&#y-z6 zxrS*OrMnHx(*tabdjg?Gnb~hh@T6?<1D|rHv*dYX#UdiA1xiqMiqGHX!ZA6nlzGSC z!M-ItMTF`vb7ZjZuWu6@A?KUV4T1Jan(D?`(19Eow^>&IIk<|InhUnEU7vz-RVTpDlvW}KS}t% z-15kNfX!zxqf_dTE5!g4Qaf1Q_ z9^?U^;N*EloQDG?p4Gd4>$08Fi%o$hV1s&%E7^tZBY%tudJE3!!>&0{_s(F5d}$ z7KNO3-rOs`N9>YD_F8O;N=?AFSDJC&pDzH?@3c`#s})&GE$$H9q_8n=;81BP#MfmA zX%1z<9I)R(-8^Cmct*Q8OBJsl4TiDTzfVn}$Wx_4jtB2TzNkgq1M`5P=>vpwwbOMh z;Hrt`DY5yA!_a~UVHS(*f*5FK2JeC6t8pzKBV(&SyYL`E+9F2QlG9tVZBVVImy2Um zTyuUA3N~gk1CW(}buplycCR!%HYi>{jXm8d5^QYz)&g@q2B+i47RK$U zLpFx3;UTT5>66Y*@6su9GQuqOUu*^|xzck=F`6hDf~l<%9i+A|HAXDh)R!#U$bI<-qjs4BJc0|(U-+JBR{ z5;yl?&&FVLFn48U?_re4Z9rY^+?8!@nuLBdRBiwktKcAL4u0-nxT$gzy~Tipu*pv@ zjQf+{xM_4`xbI}GRmFX`g?=%17fqlO*WZ26GzU@kYa{8&Vl&c)OPh@kW-A6STDpSd zRcu8Yb1Gn!i4uDRYaUs|e2M2;PVLX=PGkK1cN@SHzExEbqg zZEv=G%{8wC^g`M*Y$`ZxB!xb%NF z@OQTOUj{M}{~Y{3*45wPe{}zI(*9t6|JjNI;gSA?|9S8KkIDNx5Bx7P;{Rjjzggjb zzoEYqaR0J|`CDD^-;?=2blkri`}?Ppzl>GV|J~R>O#i0z{-=%qD@gye5di#+=f6T$ ZQ3m`EA^mR&HUf~>?*)7O`)?qi{}1K6>Er+a diff --git a/make.py b/make.py index 007b24b..ff3a866 100644 --- a/make.py +++ b/make.py @@ -2,64 +2,42 @@ """A make-like script""" import argparse import contextlib +import hashlib +import json import os +import shutil import sys import logging -import functools import subprocess +import zipfile from pathlib import Path +# curl -LO https://github.com/cav71/hatch-ci/raw/beta/0.1.4/make.pyz +from make import fileos, misc, task, text # type: ignore -def task(name=None): - """task decorator - - This decorator will run the decorated function so: - 1. change the current directory to this script - directory - 2. call the decorated task - 3. return to the (eventual) starting dir - - The wrapped function can have few `magic` arguments: - - args : this is the sys.argv[2:] list - - parser : this will be a argparse.ArgumentParser ready - - workdir : in case you dont want to auto cd into workdir - """ - def _task1(fn): - @functools.wraps(fn) - def _task(workdir, args): - from inspect import signature - cwd = Path.cwd() - try: - kwargs = {} - if "args" in signature(fn).parameters: - kwargs["args"] = args - if "parser" in signature(fn).parameters: - class F(argparse.ArgumentDefaultsHelpFormatter): - pass - kwargs["parser"] = argparse.ArgumentParser( - formatter_class=F, description=_task.description) - if "workdir" in signature(fn).parameters: - kwargs["workdir"] = workdir - else: - os.chdir(workdir) - return fn(**kwargs) - finally: - os.chdir(cwd) - - _task.task = name or fn.__name__ - _task.description = ( - fn.__doc__.strip().partition("\n")[0] if fn.__doc__ else "no help available" - ) - return _task +log = logging.getLogger(__name__) - return _task1 + +@task() +def hello(argv): + """this is the hello world""" + print( # noqa: T201 + f""" +Hi! +python: {sys.executable} +version: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} +cwd: {Path.cwd()} +argv: {argv} +""" + ) @task(name=None) -def onepack(parser, args, workdir): +def onepack(parser, argv): """create a one .pyz single file package""" from zipapp import create_archive from configparser import ConfigParser, ParsingError + workdir = Path.cwd() config = ConfigParser(strict=False) with contextlib.suppress(ParsingError): @@ -73,16 +51,32 @@ def onepack(parser, args, workdir): parser.add_argument("-o", "--output-dir", default=workdir, type=Path) - o = parser.parse_args(args) + o = parser.parse_args(argv) + + def extract(path: Path) -> dict[str, list[str | None, str | None]]: + result = {} + if not path.exists(): + return result + zfp = zipfile.ZipFile(path) + for item in zfp.infolist(): + with zfp.open(item) as fp: + data = fp.read() + result[item.filename] = [hashlib.sha256(data).hexdigest(), None] + return result for target, entrypoint in targets: dst = o.output_dir / target + for xx in (workdir / "src").rglob("__pycache__"): + shutil.rmtree(xx, ignore_errors=True) + + #dataset = extract(targets[0][0]) create_archive( workdir / "src", dst, main=entrypoint, compressed=True ) + relpath = ( dst.relative_to(Path.cwd()) if dst.is_relative_to(Path.cwd()) @@ -99,29 +93,57 @@ def checks(): @task() def tests(): + """runs all tests (excluding the manual ones)""" workdir = Path.cwd() subprocess.check_call( ["pytest", "-vvs", str(workdir / "tests") ] ) -if __name__ == "__main__": - logging.basicConfig(level=logging.DEBUG) - tasks = [ item for item in list(locals().values()) if getattr(item, "task", None)] +@task(name="beta-build") +def beta_build(parser, argv): + """create beta packages for luxos (only works in github)""" - if len(sys.argv) < 2 or sys.argv[1] not in [t.task for t in tasks]: - txt = "\n".join(f" {task.task} - {task.description}" for task in tasks) - print( # noqa: T201 - f"""\ -make.py {{arguments}} + parser.add_argument("-n", "--dry-run", dest="dryrun", action="store_true") + options = parser.parse_args(argv) -Commands: -{txt} -""", - file=sys.stderr, - ) - sys.exit() + github_dump = os.getenv("GITHUB_DUMP") + if not github_dump: + raise RuntimeError("missing GITHUB_DUMP variable") + gdata = ( + json.loads(Path(github_dump[1:]).read_text()) + if github_dump.startswith("@") + else json.loads(github_dump) + ) + misc.validate_gdata( + gdata, ["run_number", "sha", "ref_name", "ref_type", "workflow_ref"] + ) - workdir = Path(__file__).parent - function = [t for t in tasks if sys.argv[1] == t.task][0] - function(workdir, args=sys.argv[2:]) + with contextlib.ExitStack() as stack: + save = stack.enter_context(fileos.backups()) + + # pyproject.toml + pyproject = save("pyproject.toml") + lineno, current, quote = misc.get_variable_def(pyproject, "version") + log.debug("found at LN:%i: version = '%s'", lineno, current) + version = f"{current}b{gdata['run_number']}" + + log.info("creating for version %s [%s]", version, gdata["sha"]) + misc.set_variable_def(pyproject, "version", lineno, version, quote) + + # __init__.py + initfile = save("src/luxos/__init__.py") + lineno, old, quote = misc.get_variable_def(initfile, "__version__") + log.debug("found at LN:%i: __version__ = '%s'", lineno, old) + if old != "" and old != current: + raise RuntimeError(f"found in {initfile} __version__ {old} != {current}") + misc.set_variable_def(pyproject, "__version__", lineno, version, quote) + + lineno, old, quote = misc.get_variable_def(initfile, "__hash__") + log.debug("found at LN:%i: __hash__ = '%s'", lineno, old) + if old != "" and old != gdata["sha"]: + raise RuntimeError(f"found in {initfile} __hash__ {old} != {gdata['sha']}") + misc.set_variable_def(pyproject, "__hash__", lineno, gdata["sha"], quote) + + if not options.dryrun: + subprocess.check_call([sys.executable, "-m", "build"]) # noqa: S603 diff --git a/src/luxos/__init__.py b/src/luxos/__init__.py index e69de29..bb3f1f5 100644 --- a/src/luxos/__init__.py +++ b/src/luxos/__init__.py @@ -0,0 +1,2 @@ +__version__ = "" +__hash__ = "" \ No newline at end of file From 20000d4bbc8f29028eb91d1f09d910fd803a94a2 Mon Sep 17 00:00:00 2001 From: Antonio Cavallo Date: Mon, 8 Apr 2024 10:03:21 -0400 Subject: [PATCH 2/3] update changelog --- CHANGELOG.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cddaebc..f33197c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ -# LUXOS CHANGELOG +# LUXOS TOOLING CHANGELOG + +- [LUXOS TOOLING CHANGELOG](#luxos-tooling-changelog) + - [\[Unreleased\]](#unreleased) -All notable changes to this project will be documented in this file. + +## [Unreleased] + +- beta-builder: automatically publish beta packages into pypi from main branch \ No newline at end of file From b764a8d98876deb2a0874e7824b5fa6e7e6903f2 Mon Sep 17 00:00:00 2001 From: Antonio Cavallo Date: Mon, 8 Apr 2024 10:13:39 -0400 Subject: [PATCH 3/3] improve the make.py to avoid rebuilding pyz files --- make.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/make.py b/make.py index ff3a866..e28e4f3 100644 --- a/make.py +++ b/make.py @@ -66,23 +66,40 @@ def extract(path: Path) -> dict[str, list[str | None, str | None]]: for target, entrypoint in targets: dst = o.output_dir / target + + # cleanup cache dirs for xx in (workdir / "src").rglob("__pycache__"): shutil.rmtree(xx, ignore_errors=True) - #dataset = extract(targets[0][0]) - create_archive( - workdir / "src", - dst, - main=entrypoint, - compressed=True - ) - + # get the relatove path (nicer for display) relpath = ( dst.relative_to(Path.cwd()) if dst.is_relative_to(Path.cwd()) else dst ) - print(f"Written: {relpath}", file=sys.stderr) + + generate = True + if dst.exists(): + dst1 = dst.parent / f"{dst.name}.bak" + create_archive( + workdir / "src", + dst1, + main=entrypoint, + compressed=True + ) + generate = (extract(dst) != extract(dst1)) + dst1.unlink() + if generate: + create_archive( + workdir / "src", + dst, + main=entrypoint, + compressed=True + ) + + print(f"Written: {relpath}", file=sys.stderr) + else: + print(f"Skipping generation: {relpath}", file=sys.stderr) @task()