From c562c66854792e2b8de42ec216a47c6e02308a5e Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 01/24] [R p] Cover azul.types with mypy (#6821) --- .github/workflows/ci.yml | 1 + .gitignore | 1 + .gitlab-ci.yml | 1 + .mypy.ini | 6 ++ .../runtime/pyOpenSSL-24.3.0-py3-none-any.whl | Bin 56111 -> 0 bytes .../runtime/pyOpenSSL-25.0.0-py3-none-any.whl | Bin 0 -> 56453 bytes ...linux_2_17_x86_64.manylinux2014_x86_64.whl | Bin 89170 -> 0 bytes ...linux_2_17_x86_64.manylinux2014_x86_64.whl | Bin 0 -> 89222 bytes environment.py | 2 +- requirements.all.txt | 16 +-- requirements.dev.trans.txt | 11 +- requirements.dev.txt | 1 + requirements.trans.txt | 4 +- src/azul/attrs.py | 8 +- src/azul/openapi/schema.py | 4 +- src/azul/types.py | 94 ++++++++---------- 16 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 .mypy.ini delete mode 100644 bin/wheels/runtime/pyOpenSSL-24.3.0-py3-none-any.whl create mode 100644 bin/wheels/runtime/pyOpenSSL-25.0.0-py3-none-any.whl delete mode 100644 bin/wheels/runtime/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl create mode 100644 bin/wheels/runtime/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6f33fdb6..5f0dc86f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,7 @@ jobs: make anvil_schema make check_clean make pep8 + mypy AZUL_DEBUG=0 GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} make test make check_clean coverage xml diff --git a/.gitignore b/.gitignore index 40a8a7d64..6ef15399d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Python *.pyc __pycache__/ +.mypy_cache/ # Python coverage /.coverage /.coverage.* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cdcf66b82..fa351a166 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -90,6 +90,7 @@ test: - make anvil_schema - make check_clean - make pep8 + - mypy - AZUL_DEBUG=0 make test deploy: diff --git a/.mypy.ini b/.mypy.ini new file mode 100644 index 000000000..5bf40f04b --- /dev/null +++ b/.mypy.ini @@ -0,0 +1,6 @@ +[mypy] +warn_unused_configs = True +allow_redefinition = True +explicit_package_bases = True +modules = + azul.types \ No newline at end of file diff --git a/bin/wheels/runtime/pyOpenSSL-24.3.0-py3-none-any.whl b/bin/wheels/runtime/pyOpenSSL-24.3.0-py3-none-any.whl deleted file mode 100644 index 6519fbcf5dc60c6f6f04e1cd913c5b9c8070104f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56111 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 diff --git a/bin/wheels/runtime/pyOpenSSL-25.0.0-py3-none-any.whl b/bin/wheels/runtime/pyOpenSSL-25.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..cd514343ba0047a64ae5b17fd022df13780fc662 GIT binary patch literal 56453 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 literal 0 HcmV?d00001 diff --git a/bin/wheels/runtime/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/bin/wheels/runtime/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl deleted file mode 100644 index 306d10a965cd4990e529f941801603dc1fdd323d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89170 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 OktV_$w)GKh3iuyAg)^`K diff --git a/bin/wheels/runtime/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/bin/wheels/runtime/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl new file mode 100644 index 0000000000000000000000000000000000000000..e78a278978590af03c2453bd9c652515bd993f14 GIT binary patch literal 89222 zcmZ^K1#}zDvZk4tnVBhOTV`fvrkG>4W5$@7Vx~A|W@cuNQ86wn>gkq>JR}qr*gvloH5R>pefd9cxS&r@7gJ|9W_A{K9u^K3i?6P3%wHX? zoLE)To_sgre3sKg zUkn=5JtaaGcY6^02DfvNvcW{NCI^gjx6e=ZEZ9k-=a39c|Kk+VGH1sE!WHFk3_m1O z|619hghtq1jC0gvod#g(w3W*%c7j z?Ek!~_pcI3T}P4vN_QM{ZJSLgyUPU=<*Ojp7h+o$W7$eq9Yt*Z>PHpUvzTIasU}s9 zqL_#?Qo;HVO1&4XBUC3Dltbj{beMP1bryU7h>cf)8uM50c?2*Cq4wYT{=#%WFD%r5 z+=Y|TT2dXczhJLmUDUf4!tAdTrHk@a`>bI;+9v(|=ezb5tk}dd5(Bq*qF+br#0uM0VLlYr_XIyA1fVQV;JE06ad*>NQx^u`dA}h2QLTTIH&{hyIA`YxcX@eH2aqQM<|E z7ECVV?*D3z`=JrSX|RZ28WPzj^QbS!?IxIjVT`slO?sr8Y}I<&3d*!ZQEIwoTWp-?Imi<+1AnL z*dlYl%M%Hpk?+$&;)QPNuSK-h_#dr5O9qRIQ0Mq1t&3%LADy4O~WhLIw56`_iQj5o8MXMFRGu+s@nN71%gpLTYy)r#Ydg2cH zuqNA5Dl;F(N47R{!#D5~y@?gO4`gGP)#N7nV`EcO{qeOnJk>vMH4y?I)j{K3lSfX2 zt;V^;LA@J4${|pmzVmKDKsSDNi{se6JlwavCIj;P{<2! zN5SgMvGSN+NAGWVJ`%su1$<3S^uYJ1em34#33n_}jJ35ny^&f$IZVrIhgmw>YtR>B zjdk}6W9iYR#@X85^nC;Z1%@HOI}1?Fd&DL-YhwHusBp{w`i!W;yxq)Sws%6Udr7IK z2~5E!FbpVN#Qb)kL^3sSDjRKOMUz^@wug4WW?=SWuZs@A4QV` zgDBKfExlSLj`uu%I7t78qu z#3p)#Lz5o2j>4iP2r2AUMI2JpC>N!wHax*9|Gr0@(;f(&N7%zEZerCH!CXo@-2Irr z4JETTCO{xpAZ!Fm=P%~z-66ydCV%!Ahd(wM2EqJ>dAS!Nn2>{Zh&g!5nBT_iB2{|B zav-8j97=6n1hjTl{NbZe(eLmmozM}olOe+XYDm%+>d2W1ij$)fLY5aPa91WfDt}QD zR3jhY-I16hC>Y)oj#+-~Sqt68XK?02=TXJQlOa#2Dm$n1YxGgJ<#75pZMhk35uIMusB?8U@s0~( zlFO##i8ykD5!j-XG~=UOXiE8$C#$7^KRoY8<=7ZKhQwX2iYHR?6R|IB01+P)#R_F} zfyJ2%y0vSj!fSsncNJAouL4U;i4y7Dah9{G2@$Erukgaz;$zs)nF7KOX^mf~lQY$9 z?Niawc!|)LrXBfIMIBIroqDh4ckJ_o1gHiE;STBP-^|(e&o!R%>pb_&DB`#|JX&t= zu8ZwO*$Md$EE^?$j>C)+vbDl}B@a0wysa#HAq>j0#5TpDl$cjjA1NT2CGO*j)?KQ~ zGQ9^ordoc`)ki9(dBF4ZT@k1F+EH%Dmo!AS5AD2EtfQp#h_*|MBo9FCHqapMHfC=9 z{Pe+iEULu|g`%7h8KNKMZJ&|oC0a#Jt})I5%l=fuqt&FFbwJ+42zRCsT7Et-l7(W` zS73B^F{KhsTz$ooI$5bHix^XA*Ix=3dYoZ8lxZ2i6vII0V%thnz z1~8haa|%kb9$0r8HaS78mqEoKb+6nrU+D}M5nD?V>a9}!VQ+UU6Xw|lo*mm3xt?(a zKKl!Hwcasydy^GST7OH^s;6z{t{d|ENw@*w007td^eC=u84V*GQ(97~kpp1b03BJsb!zkiEU( zY(t7vSI_&`a=JY>+1qn?C)Zz@n3sHit%UBy{u#uj(XzaXymzb!!Snxc|APy)dUg}J|&@v5VXz@66-v!TQ? zD>2HRf4B%UI2@l3O2w2WCGDaPUE1dq>cC23_9$v(<@@Yz>O@f@;o$@`03WRWIkB zG*v$xmwt6o;cjnUZc}@V9QFwl2^uV>JNwlB}$9f7CI3V8c z!G+*YUD^DECZFf>xC`mZ>U0;<@Pk~i>3v{p|N49C&BglF)+_uwkDED^@-k^J@@-3& z;IV=ErGp`KAY6H0?;KLj{T7!q(MFL&?N!A1ZiHw;v%7M0K;WPISY-L#&PDvsoP?Px zqdB;X4^6pq0-`Lbco^R>3`isQLlW`RFX3C>`dM(_J*dE#&7gm{)^|TE!ecBuSPF15 z39AJvSi^TRh}cbqmVZz{Jcq=5VuQ0T6KE^v9KUBXnE|J@CpS%<0;_MVYBdGAEd@!f zj0BV8FVYM81PLDW$O0fWpoj;-phA;$Z>RY}p2r zI?wbvYdQNdy_=L6vtT)_q;SLmOd8@}^{y~eK)JU>{~bIeh;^1$fY0!VZiX?aab_JU zz8V_pctp@;_(qA*DQh6t4F7W|>bFZ7*Gh?1Ee=Iyh?at*_v9k#Xz0%c2JGkr(FGAA zGByT#^DZWA)B^NeI~q$}8{_X5aEtcaen7BtdCWq3EAAfdzh5`($Ex%*piI{Q&G*s%E8AI}P2J3G zEL~Zgy{ok41W*m{b_Bcer+taW%xhxJ)z*v_s}q1rx%R4W_cO2_((xVErj?83N##qAJwmk| z0uKdr787JQbtbKqoN7W^7mJ99B|UjmKu zom)iV$9}9K!iR{XtHD35X1W!~1Gb*Qn%pp=6WLaOvl`=sY1Rx?xe6_%bT);e%MUMV z`A)2kB*w4+Q4S(M5{e~RK(i+q2)+wC8EsAIN=X2Rp!R9r+AlA{`K~?!9obq zwpq;U(LWb(%XEs+JLQrQP7$y2ROMUzs!X%jWqsh%zCrsw!LjM&#Mi&5P2f6SckHpqBe!{&|x!L>Hh&VA4*g|p|2??r5ghbMjjaw9V#uj4Kv8phlBrl9U2Lq)C)~v(d z8&yCw%$f`TiHq@kpM>mHN+8%!Uq>lgaEpIJzq2~25>uI4u>vZJ<`}%a%q|fWz4Rev z3z8*6s!d_N2KB&50)$vN^9^zG;=5F%fk(F&@!F5}Q68+#UIE@AmKi#~yHR1ShfaS4 z?~DnvYQhYn(h~@#;=%LPysdan$VqNJ9VRKsZBJ@GwSs1hRzo_ilRl->(t;W_Q719R z6xT>=At`of+ds0WebUzo;Vgy0?F||`$%2Kv1YIm7iZhDPUDl3gFx*-a#~l60G|BDC z+j>w!Aac;kSt)D4#HT{6L3(P<%xfA zY+znnI3oRgXXS5)BN_90Pq;q0&JQ+mYsyTKe~1$VKCnE+EC%pl&TVneT=M4qTo7#+ zWac}K{eaQCq9=pcVW^&C1UBo^?OX6=Z; zBSEg-s}Z6j^+&qc&6;R}qa4~1WABF_2j*dtqK>pBmH&WFJ{2-_?K+Ext*V~7p{1KR zLdRRa@{D|*p^fJ?JmRm?8L*zzyLn5^Y>Q8&@&=D-Q;N#`UW&iJzgF=6;I)E zxccKOJ`|#LLjXLbACHa|>YcTUc}hEw)P&?cvYD*|oENES3)LpZ3JZW}zN)VLchJ|@ z3ss#SM(n4Mem-$b{v49QY`+Ks84!jIm`R0b>0kJQ-WdrX!z^bI+f*2P<;6X4DH}We z!2av(C7mY`w)%P(k?>NKqlq+8K|Z*CeSXZfdBR>Y05XjN{)fTKCfEBwtG+0*o) z&DM4r`8{{)NAn?;o0dkF<@7kGaVR*5x=SKWX-iq3`SGV|%es5fKno-bj} zOMTaYCSCWXgsXI9K-Z#6`6s+Za?3eIq-G)1%^8xmRej7m`R}v)Dd}J|=oe-v zU^pXt>clP2m>GCx#O?vU`F7g)_nqKc@w-pp={Pd2vkLw3L!K~jM!Sv zCF~V%)sRw;C@ollV@NdKU3by;%MsH_Oc?2I*Q#A%bDwVdAf9d-esmdbS1#7m0*tgz zPco~ve|t(hX;siT!=|c@1o|ayHlOlQt-h7#$(D}v*6iYR7rE*Pw9^SA8PS>wjg95@ zdq9`Y@Q`$Re`1laQ$=4O*s9K%&od86isz4Bh{&CsG!r+TV>fpMAX;Tw#0IekidK(*q4)Z zN*KtW0`ObQ%WGU(&X-|SHqtp%v3#ux3RSVrgK&QNA^YU*=(d@hw7hpP{HkzXBKp4& z^$=3l;ZDCPRIzn$XnBeOYQL~aoIYaC`((y*L6s{V=M>MZb$v@<{^&EAGxkbhA^z1V zn&xCUO>pxVrC#vPfi`D>!}uS$_OI21eDjnt(pefsaUWncQ3f+K< zXO|aeqp^fUaBA`^m`+l8hBY-T-I#1B)Ej;lG?3P8WGYosuEnWU8r_P1!;&-`|wqLc6 zXjacJ2G<3WiJV0e;8_R_0)1EQ1N9A@;p&Za3mtx0&dn8Vc2hmB*BBMcL?!L#8d?Zv zqg!lX=rS!w50z6?p-L~f>3(-~;tKd8y|kC}^=!M{F~0oB(XspeGQOc@^#&;WrHcDr zZ$OJ zQu}%hYWYMogVVaeTl2Uu71`s){ZfUtF*n1dMjGZ-jGmgb*WY$w5dqun-_=gGKHnZs z2;E;W@4TDLIuXG_*~01vjlk4a zGI>6tOj66|l*{+}piW)|qzhZWAnv=GoDie1a2$`}3;XHRC?jK3Kq;XLK^XmH|0uYLpkv+FK!e}stNRa2DZWJ+LD;b@h_c(REyNBw75+Cc5VI= zoBRlCug#bMRtiprPdLGU?_23sAmID^q}d6JlT;(Wt7As#mp7EDQyuY927@);oRKa|=da=^e;2xr_5V49q-lkf+yw2aay+c8M>KtH^>1P?6ycf$_0K8NTHYP zSUN_0i3Kw)fmGo-<6gnGVUIz8TWKNwL#lc!BCjbRZYdqSAL?O9!{qUyU5nspLjXk- zuTg;+qo!eUe)^W5eJtG#&U|xl7W*OkK&?l&}ls^S}Isv?<}^UwitYmN|vux`?jM~TdjSPf5Jj*Lg#Yz z6u2=Vo2#}#DaWrTbT@(l^%950SZA@dy**ed5huv>H^j0M_JQRFPED|<1@X>jQ|p)A z*zkr=zw7tiv5;!_!-(K7pVwZ_8$Y3Z!PJ%uG-(d(A*Jx2m1E3JU$#WUk z1f1L=Sf5o0Om<(Y6v;srg6R>CDqAYyuh+-cUqHj5+pxRLHzfT2GkZ1LvRCEK@CXgZ zf7rWL2nkiG+`G^aD}>`YGSuPI#h4;@p2jB z^(!-gfR{JMD&CKf87I=6Ir7Vk;J)jS3K&RtvD$IBv3RY8DM-PH>LL^f1{;#eXmnTK zbif=Vp0YX(IwaEfFo}U2uI5a#YzJo{b;5;}{ruCCt)Lv=*Vr=6pF@knLG5=$!vpW1 zMndv%WUp_`Y}fa+HJ|5Se9fp(Vs%6E=4`&$#PvkSJL92}s#FlHnwTg$u$+26;I|;< z|2{3~Bo0vp7$P4yKq&YLaepR(HFV^1<MF?I?(@ z;;B!G_u^d6`mMD`mBX@<{9$ow$9Z4q&^JnVy2Ry2+{MNNlw-`&u?2NJW7PV`ClX=? z(rbR%-3d#;X=Qri`}1Ro1BsgHfzOxc*BDhGY%D-A%r$WSk0pkaBZ8c{?g{C`C!aTnl#g) z@3=N=MG!%D#M?d1XrsRsSA^W5>jLc-buUo3fOzJM@%J7k7e1%}xgezHYJMxV-t}u`P+uYyDmj_Hn}UhvG57>6?06Sgn|yW*bTQvRy=q(c+t8#h)A%IFYkic&}kvS zHwThwHMX9~;5pY{=4Ym>qq6-n&?<*WW2-b&;9Pe~mRO%L zgsC{+xyUxI7fH@k=dU=fUx(*ogtALiq+zVn9-}h@`ux6EQm#k&LJmK#PW*{rI2Pm+iQYRJHK7?@ zdcy=1b*7Hi5|Yx@1BVz}RrCB%0>XU7*$6b|Lf!|SvOSV@-y+)d;G)&FoDz$a+)~cZ zv0Uj*(r}a@yfW(=j~^S3Plp2|>VLi}i&}zxTbV7(6vZ+&O1j(So6Dhy+RnJJ(}(ya z7s)IqIg8F%&f7}o9)_~~?tsOuDeaV^>7fF9J8kZ*QgltA`5;-2W$8k+GU$H*GnL4=%*3bS@`u zqxq0c^bmXMxG29uEZEGw3_&r%xq$5nVc+#t1s&g#J`#x*BbW4mlBMQI+yh*=+5wQ721bbfd1BGe0!%kS;znJR-Zd4#XBmg04<%~+M5 zVn|Lbd!Z*X4EOtf3Po@x5IY&mNwA!zC|Q_WxB@|*H+DQy+-Q7>>q+vPWjoE&{jKg! zZ_9lr*H?dQ={mEA>2ef;oG1!&J0$t2IB5O(*{M7ueea9!F2eCib}CE*u;e%hPIqkr zJq7u!w4r;;B!>taZGi_hyDFxZq_fEjT)iTD~(3cvu^H^{NGN zeg}hvLv5l%Xn4_tCt<6m%{NDA+J*WC)1y;w$I@#3jX-Lkh@FHfQJsapmqLCO4A*ZV zAG+=y1!q`RX{7*LM){Uej~d+*x)7p2T$NN<*3e?xqmde3*%+#@`)kYZXQCbA2oLNiYZampT zT3PQ5!Ld^+>Do2&vuaTPfnx_ODvy-x9_M`QB)`Go{(1)(Mx|h5*M+K zGNin#IE9g04BxeN1!AsX0@^Pz2%0V-uM_;cw3jk)=6+gW<{TeINU7Q!-i}~@KjBO= zS{+VdC<^NDN`{9fmQf5G5j>M~8tJTi$`}73BkXt!R8!P-58vW3d_y*Tbgn^-G?BU^ z--8lNF%l8OjZ8$;UH0X)Hk~<&LOkq-oe@;mmzi{Me@T1)FQ^`SB482Q(^y2C2;WSq zC;(<$vO$S^BWF7U^oAlLy&FS}Myu3!2(o)CS_M_NV1EQe9@1vf&7Q8|j^CIsGg~om zUlB01{%VcO@ zZrn;TvCmR!bbe&+fKd=eO*kg(eS+t)?;vth%0`G4_?;%5=BnUj`_(7$Zi<^yWcAde zc8>OKh0CYZu3vH)o&WlxXiouJWkgSCg*4t*%L|Nw+igJhtLIxvpXiJfd8&7K=QN*S zwo8X*A3j|N1g7CHd)0A?(iF_)oDO{fm0y#Qr0?^sYLg2|iTE)TuAN@gCHDwJ z2tZ|9U6+jFlaj@=BstwB`LeZ=?wD7vUzobZkCqeXk>@M=9kJx3@p4j@=kCI}{bZcE z6T`c6^)$qN&!};xh03+}%j_JBcuK%jBcTe24S7TkXG=l0y#eT7G?1uv$~@FN$CIOx zshn*^Lc=Dd-M2I%!twjuFG7v2`hNNH*gG9g6z!>pfWFs24CVrJhE(O#s*{#Zk|I2 zg@Ye4U;Ve}{o1+<-J@}$5w=*^bgubs{l@LO(M`AV+#I_Mu+W~&zovhU)Rc-psZY!` z#>SX8(>J*4gxlEhp$?rUWn>u!6 zE9t3$BZUA#jFsmjx;5}^;V0a?tE~?zPZj4)z>~k*CF-95BtfqhSY0svdO0dy)Yc{% z0rEqUCn<_<#r|k8Yj0n9@XfklM=x`iKZ8Vj)$r=Kl49X)DV}s(LNMu92oQ~8A8v&* z3~B|F+=oF~4mQze*TL+cM$Zaf*t(e#49mM2GZk#plP)6Pw^c2^vFm>oYj1kLxJYb; z?IZ~WYoYf`UKjni0KPp&=u``3)D7^u_t$MF2!?XjE7#;Cp7Zcfrl}f+=*~LYvN(Tb zy$`y0M^}ZpbxrdMf(>=~r9EDrssea;BpfSGh_qO|rp8enQJ2&MH?1=YI+akG4! zAdF@XX+W&C(n%0!p2wW2q$YQn5R013mA{n`Ax8jal1bMo`;!o`bM1e=-v4uGb9 znqw_gAAouiR!!$mGfWAdXVSbL(Y4O4@D`%wDI`#KJ&oHCLq}s4I%uif3-1}{mS}!h zty9#Fm%^ps*lIV)v_$iLe9mJo#fLrjQ>q7e>R_2 z8Be=}_iJGGA%EzOR0p}Id@2@X6Ho;YQ0>$K)u=`OZJM}L+Y*--?*zN;g@Zrb|~ZQH-c zI@-oIgk5)!Z1P6d#gdUuc6XZEtZs9p|?N$1-ORuHgtxC#)QRQCWirpja7|_eFJV31dzgEgtB2|5li4~Nepa#WkEq+~ zwMfO%Y?I(Jzs>#fb_-@hG`c60%>Hr)rOI2~F-*G3f_nMX9+KDfittP8l)}h-qeATK zA{(BnWJ%+F{#v-%%I!+!AZ>hPWX4;qXV8 z(6HH1!yT)U`$-2Bz9A$_N~WYX`x{R1xKhGuB7goZgCnn8&(P@=IaE$Y+g3SF?D4cx z9-r&Zap}PpfuKwuvg^Q04#K~0(h}#w=#fL zXe;+vIIg|WkXJyP%aRiRq>WrXyy~w%WOw2YvtaZD#RNxjHh>R74QMl3IdSiLENe!E z?Is-)9GUth(gLZUccjJ%{7Gi?O#_Fp>HrvAKGNH2GIMmatQIPLvVsi-#<)+F(`MOy zVYX6mM#&;KBLXR#!52<~{NE$EdV9XR#$PX&Mw$&NZh`J|a2CEH?5}9&va%Q{B9;ymmZJQ`xyr2^Nc*((6b)c#K3c$)$5y~u24dy);+J+XM5^kB7G_=nsRR^ z?qx&3_2c8Hzl!7ZGFhOU560C}y&#q=OV4lc`DzKqY!SLZ@46c{rnyQ{y@twsCo6+W zD$G(#04C(6*}QHlL8oc{j{7o3spQ1Q`&cQ*Ph@%uN4H@za_5cx9CByQP1iOMgiL5y zx)ULBPe<{^w6vQH%r~8EO5>!dZ|Ju`mr#V{=rbCEg-C@K@CDyDyA zTf#?H`ex15;?tnrH=6fPxa#F1D>8WnsL})DJ@t1{oZ6G$m0Dhl*e<0 zE5eHOHwm&459XO-MyuVcSK^8MRv1#^82cBw)QI~2Gab2UK)zIq+5_O5{}-Z#9CWxM zt`tmsvOn)b90@Gq+=$7XXVGA43sj9zV?wUoVC5+r%%SJ3$hW=kY4k_UfBJ$*`mK%? zE}?)V_AQYT+l#)t9_X&EYe=3HtE!^r5THLWD3jYLYAV!dY(M+^-f*dPmx-4Wl@bMe znx8q81PU}i2mJej#Q27sx910FGm|MK80-ICb@}fV33F#}HybBMW=?hvW-nfDV{R^H z`>&4fUd+~x?kuiOXI=1K8j{NZU#AGFP2Kh^5u67Y(S95O5jIm!_#ihjkyX(_s)TST zag1aXDBK_R^HSMIyiw~JbBTQpF@zzf5+c1q6eb&-t?p1?SjY-zxA{uT9ksXJC?`)} zKXX4H*93tZw-xG#+2#CATi-iYlqPd5R5T@h#Zs;jTw*ct^QNz#Z^gMX-KaI$`#y2$ z-esDTG2R-yLjjtVF(%zAYk_gyJWF}w&!a{{Bkqmro&gMph#@_l()f9g!2kz^9ozQj zL(VJTAwlD7#E(YZ`%6zL)fAo8t*O^OdRTvzCA;wxSQYpl zQCV|2lGhRSSYZMfD4=iMG}(->sK5Uq+7BrmCSk7>Sbm;jS@`7pOaf1)eLtR%$I3M- ze>ws9xdzWKe$I>jNbNJmeiOR6tvx7$#eH+w{{mPMetkMS^;h`*k`7#2@w=T&yPWJ1 zuCu(H^X&ct%NW7AsEza7(5!Ca8$p2gIfsVVL(jzKpND~010O66b6raNwg$1|F8YQ~ zM1mK<`r{)#WN~JX%m;-b=(>(P=vr3v%pYs;Gm7k{MD%Q$2WI#ZwUCw>&IqHp(=~Y1 z8mg>iNOaFh6=F941;gnzc&C}nBUW^e6iIES2C6Rtc8-(h$EJMnQ6_e=u>rQkjJW9D zKyc&bz3AN}^52O#etb-l-Mcy@ywD?3d@7(lr;*+0ivG2=PjGq1D$cz`F!OXv z@QFhz4A4P)e+}6QlS}YI;rO6}>BEJ+2Jp$eSEBr#DI>ejCZZxafS%*z{Q>wzb^|SX z_QCkWw}tG62evE^T=b8fb;3gzJzQ=%6bWfJsv2N3_-O%W@Y6wb{MD`28z9qW)osU=7X34Vs65b>Df(O|_?J`U^wZFrKV zpVD`Oo|rLiF6?CL8Q0V~9-q;^ksp^cko!<0lk=ZGD|?olmOHFZVn}ard02!m*|(ft z3yYS|VPbZc`$+mJrlF#v=aQ;Erk|r(KbQ)bYLgqA(a*`-XJTSzHiozw{7L=1FmA}l z$RL-)m~F{oJvTT$ej}$)Rymos?>6P4nU=x~DO}{D>u+Rgnd<8CWz;GKTk%`9k*1NZ z2K3j2E+Qgp3tMkhclw{%-Ck{&F;)VG_$=BbzkUp0_J+wWS;`ww?^}Wey)azNZ1m6D zmO6)2?$4NonINT!8HC&rrMreHtL&Ebx-vu|7%Bx6X+SRI|LQF|p=Pl(vNR2gE;-ap zTdADR>uMJpPf|}+hdEbkhN}Cz#E2unczZjp&By3RAzVZ>>XPQt+q2BC5rve($0(mR zi4gp{R~LR&Z}F{Zf}RJ5ikGpLyA-EA4NIVcSFm7F_XmaRxLjHaF5j(dej?)pjb>WS zYzthC#k3+rje+XX&2?OVxtSvgqm0h7?N<-WF9*5%o%MgzuRcA)3hQV#7JVlE!Q}d@*58AOLjZoJYN`Bblaxom=ur& zV`L&&TUwc>s)r6jCDMRVO={yp-a%m2!c8*v2)_BGRm_4$3b2{Ci=M8owO4tKNb0P^ zprREyXi@FKx9?LL>>}B=uQ8RKrJ<+fFuC@1+Hz+`u1BVZ;aZvlM>{oLtK-dA|F|-R zfa1H@M|S;MYM6X=0s(B1b8f>`ROWQa5dk+2ipDc$R1Q_C`=M?L_2SYEXNA06v<=g2 zI-$U_0xe#Z3(m36>0}c15azhH29}oEdHQav7Nvy*Ztu=Y1P@X$c#}n1dU}0ppyL?> zJri~=EFOE~%P1qW!QV+bhLb?ke37A6ekz437WY(*l|8`%b&_^sDpRogY-j}T4 zuGc&WXnh}fK~b68nTon83@i$^aUnAGrc2bZ@^;r%MO!1vSiHT}W=9hM&!WGj)!;Wx zB47y*&z$ZrTvAxqHH$qAGpmUe2`h%lvl`bB?jzZ9~S-XY%#$ox^-`j-G%n? z?z?;#S^3B;J-vF;$75awHe1GM9XY=;N%5Rs`5P#Ap*R_iA88S9_1-taT#sN5<~@*o z;5|Y;jFbZF5tRibZS7lDpjaRT=~zc~LC4z##D zYY`iw!Z{y+K>6;_C#wStQx^HWz{GWVRv0L(DVfA{q4w^+25@d2f%M| zYApJ84Ru{A^aC*L7xZ3t;#?JQ{LgX4>SWcZ6QPaeT0U^jiN9Gnu-=yIL%cOQ(WF_E zcM5`B=w+pZE>Z2Y{#;ok;yXFdzw70wQnZ zX>|El(<(=x?)w~^I+p||LJ)6dkDMP}1>CqetegTLEwkL7JUh3~SAfk!G0i8=MR>4o zt@m>N*HM6r{e6y;D?uZcER;{(7)XADZ){1`1ITZ}72***)|`6z1Iz~9IuSh1&w9jL zITKFHKx~6<(THuv6JyrA37cdT<-M23(<=zoPkvwC^v9$9((7pL_v>#4TfYYgpLtCd zfXQvXg(xl2FDt+X$@kN%KNuJ3D6DArH6z|VcC$ckqv~^?fY#4gA8*we(Yx$L;5nz) zi`|FUyOb2Bdux5<`U()6NO=iZMWnm}^j_gSnO)yMjSwU@stuic=I;ywoV}T zvlE+tLu=3`7R70!*QUxScV)(kc&jrvUEC@Cbgg_~edXHa=>70|`*+L4M3cHPfDzwe zexkBBXWkmVp-gt`DXyv#k{Fc8nZ6!;S zb>8()r@KEof2c_l4-Kw3$^V;RuxlXux?)30A2$T$iudg1&TeS&u zIX*(Z{>pyqq@+_5S)~J6&u{Db1E;Qd4s*aJUm}~OQ{b*gKX?wn_x)rRc<#HAQ8Q4r z@rgs6+xM;5X*f3XNeo&d!UG!tH}85ruE zuUr|p#v$GsKO~Mf%8hqA=kE-zSx`E;I^c_;A(|h%y+z1E(SCZNQjNd$Q38!dXODne ztBϬ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 Mapping[str, Optional[str]]: 'azul_gitlab_user': None, 'PYTHONPATH': '{project_root}/src:{project_root}/test', - 'MYPYPATH': '{project_root}/stubs', + 'MYPYPATH': '{project_root}/src:{project_root}/stubs', # The path of a directory containing a wheel for each runtime # dependency. Settng this variable causes our fork of Chalice to skip diff --git a/requirements.all.txt b/requirements.all.txt index be3953690..865b61776 100644 --- a/requirements.all.txt +++ b/requirements.all.txt @@ -10,7 +10,7 @@ blinker==1.9.0 boto3==1.35.84 boto3-stubs==1.35.84 botocore==1.35.84 -botocore-stubs==1.35.94 +botocore-stubs==1.36.0 brotli==1.1.0 cachetools==5.5.0 certifi==2024.12.14 @@ -65,7 +65,7 @@ jmespath==1.0.1 jq==1.8.0 jsonschema==4.23.0 jsonschema-path==0.3.3 -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 lazy-object-proxy==1.10.0 locust==2.32.4 markupsafe==3.0.2 @@ -73,6 +73,7 @@ mccabe==0.7.0 more-itertools==10.5.0 moto==5.0.24 msgpack==1.1.0 +mypy==1.14.1 mypy-boto3-dynamodb==1.35.94 mypy-boto3-ecr==1.35.93 mypy-boto3-iam==1.35.93 @@ -81,12 +82,13 @@ mypy-boto3-lambda==1.35.93 mypy-boto3-s3==1.35.93 mypy-boto3-sqs==1.35.93 mypy-boto3-stepfunctions==1.35.93 -openapi-schema-validator==0.6.2 +mypy-extensions==1.0.0 +openapi-schema-validator==0.6.3 openapi-spec-validator==0.7.1 openpyxl==3.1.5 orderedmultidict==1.0.1 packaging==24.2 -pathable==0.4.3 +pathable==0.4.4 pip==24.3.1 posix_ipc==1.1.1 proto-plus==1.25.0 @@ -101,7 +103,7 @@ pyflakes==3.2.0 pygithub==2.5.0 pyjwt==2.10.1 pynacl==1.5.0 -pyopenssl==24.3.0 +pyopenssl==25.0.0 pyparsing==3.2.1 python-dateutil==2.9.0.post0 python-dxf==12.1.0 @@ -127,7 +129,7 @@ smmap==5.0.2 strict-rfc3339==0.7 tqdm==4.67.1 types-awscrt==0.23.6 -types-s3transfer==0.10.4 +types-s3transfer==0.11.0 types-urllib3==1.26.20 typing_extensions==4.12.2 tzlocal==5.2 @@ -137,7 +139,7 @@ watchdog==6.0.0 wcwidth==0.2.13 werkzeug==3.1.3 wheel==0.45.1 -wrapt==1.17.0 +wrapt==1.17.2 www-authenticate==0.9.2 xmltodict==0.14.2 xmod==1.8.1 diff --git a/requirements.dev.trans.txt b/requirements.dev.trans.txt index 6f4912ab6..2fecc932c 100644 --- a/requirements.dev.trans.txt +++ b/requirements.dev.trans.txt @@ -1,6 +1,6 @@ blessed==1.20.0 blinker==1.9.0 -botocore-stubs==1.35.94 +botocore-stubs==1.36.0 brotli==1.1.0 click==8.1.8 colorama==0.4.6 @@ -21,7 +21,7 @@ itsdangerous==2.2.0 jinja2==3.1.5 jsonschema==4.23.0 jsonschema-path==0.3.3 -jsonschema-specifications==2023.12.1 +jsonschema-specifications==2024.10.1 lazy-object-proxy==1.10.0 mccabe==0.7.0 mypy-boto3-dynamodb==1.35.94 @@ -32,8 +32,9 @@ mypy-boto3-lambda==1.35.93 mypy-boto3-s3==1.35.93 mypy-boto3-sqs==1.35.93 mypy-boto3-stepfunctions==1.35.93 -openapi-schema-validator==0.6.2 -pathable==0.4.3 +mypy-extensions==1.0.0 +openapi-schema-validator==0.6.3 +pathable==0.4.4 psutil==6.1.1 py-partiql-parser==0.5.6 pycodestyle==2.12.1 @@ -51,7 +52,7 @@ runs==1.2.2 smmap==5.0.2 tqdm==4.67.1 types-awscrt==0.23.6 -types-s3transfer==0.10.4 +types-s3transfer==0.11.0 uritemplate==4.1.1 wcwidth==0.2.13 www-authenticate==0.9.2 diff --git a/requirements.dev.txt b/requirements.dev.txt index 6dabf2df3..21e79ec70 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -14,6 +14,7 @@ google-cloud-storage==2.19.0 jq==1.8.0 locust==2.32.4 moto[s3,sqs,sns,dynamodb,iam]==5.0.24 # match the extras with the backends listed in AzulUnitTestCase._reset_moto +mypy==1.14.1 openapi-spec-validator==0.7.1 openpyxl==3.1.5 posix_ipc==1.1.1 diff --git a/requirements.trans.txt b/requirements.trans.txt index fbde89dc9..8fb841e42 100644 --- a/requirements.trans.txt +++ b/requirements.trans.txt @@ -21,7 +21,7 @@ protobuf==4.25.5 pyasn1==0.6.1 pyasn1_modules==0.4.1 pycparser==2.22 -pyopenssl==24.3.0 +pyopenssl==25.0.0 python-dateutil==2.9.0.post0 pytz==2024.2 s3transfer==0.10.4 @@ -29,4 +29,4 @@ setuptools-scm==5.0.2 six==1.17.0 typing_extensions==4.12.2 tzlocal==5.2 -wrapt==1.17.0 +wrapt==1.17.2 diff --git a/src/azul/attrs.py b/src/azul/attrs.py index 535a7289d..849312bfa 100644 --- a/src/azul/attrs.py +++ b/src/azul/attrs.py @@ -111,13 +111,13 @@ def __call__(self, _instance, field, value): def _reify(self, field): # reify() isn't exactly cheap so we'll cache its result if self._cache is None: - reified_type = reify(field.type) - self._cache = field, reified_type + reified_types = reify(field.type) + self._cache = field, reified_types else: - cached_field, reified_type = self._cache + cached_field, reified_types = self._cache require(cached_field == field, 'Validator cannot be shared among fields', cached_field, field) - return reified_type + return reified_types def __repr__(self): return 'as_annotated()' diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index 7eeabaeda..dbc0e6dca 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -8,7 +8,6 @@ Type, TypeVar, Union, - get_origin, ) from more_itertools import ( @@ -21,6 +20,7 @@ from azul.types import ( JSON, PrimitiveJSON, + reify, ) """ @@ -457,7 +457,7 @@ def make_type(t: TYPE) -> JSON: return _primitive_types[t] elif isinstance(t, str): return {'type': t} - elif isinstance(t, get_origin(JSON)): + elif isinstance(t, reify(JSON)): return t else: assert False, type(t) diff --git a/src/azul/types.py b/src/azul/types.py index 0c0980c78..94825cfcd 100644 --- a/src/azul/types.py +++ b/src/azul/types.py @@ -8,9 +8,9 @@ from typing import ( Any, ForwardRef, - Generic, Optional, Protocol, + TypeAliasType, TypeVar, Union, get_args, @@ -27,27 +27,19 @@ # two generic types are the most specific *immutable* super-types of `list`, # `tuple` and `dict`: -AnyJSON4 = Sequence[Any] | Mapping[str | Any] | PrimitiveJSON -AnyJSON3 = Sequence[AnyJSON4] | Mapping[str, AnyJSON4] | PrimitiveJSON -AnyJSON2 = Sequence[AnyJSON3] | Mapping[str, AnyJSON3] | PrimitiveJSON -AnyJSON1 = Sequence[AnyJSON2] | Mapping[str, AnyJSON2] | PrimitiveJSON -AnyJSON = Sequence[AnyJSON1] | Mapping[str, AnyJSON1] | PrimitiveJSON -JSON = Mapping[str, AnyJSON] -JSONs = Sequence[JSON] -CompositeJSON = JSON | Sequence[AnyJSON] -FlatJSON = Mapping[str, PrimitiveJSON] +type AnyJSON = Sequence[AnyJSON] | Mapping[str, AnyJSON] | PrimitiveJSON +type JSON = Mapping[str, AnyJSON] +type JSONs = Sequence[JSON] +type CompositeJSON = JSON | Sequence[AnyJSON] +type FlatJSON = Mapping[str, PrimitiveJSON] # For mutable JSON we can be more specific and use dict and list: -AnyMutableJSON4 = list[Any] | dict[str, Any] | PrimitiveJSON -AnyMutableJSON3 = list[AnyMutableJSON4] | dict[str, AnyMutableJSON4] | PrimitiveJSON -AnyMutableJSON2 = list[AnyMutableJSON3] | dict[str, AnyMutableJSON3] | PrimitiveJSON -AnyMutableJSON1 = list[AnyMutableJSON2] | dict[str, AnyMutableJSON2] | PrimitiveJSON -AnyMutableJSON = list[AnyMutableJSON1] | dict[str, AnyMutableJSON1] | PrimitiveJSON -MutableJSON = dict[str, AnyMutableJSON] -MutableJSONs = list[MutableJSON] -MutableCompositeJSON = MutableJSON | list[AnyJSON] -MutableFlatJSON = dict[str, PrimitiveJSON] +type AnyMutableJSON = list[AnyMutableJSON] | dict[str, AnyMutableJSON] | PrimitiveJSON +type MutableJSON = dict[str, AnyMutableJSON] +type MutableJSONs = list[MutableJSON] +type MutableCompositeJSON = MutableJSON | list[AnyJSON] +type MutableFlatJSON = dict[str, PrimitiveJSON] class LambdaContext(object): @@ -127,16 +119,16 @@ def is_optional(t) -> bool: def reify(t): """ - Given a parameterized type construct, return a tuple of - subclasses of ``type`` representing all possible alternatives that can pass - for that construct at runtime. The return value is meant to be used as the - second argument to the ``isinstance`` or ``issubclass`` built-ins. + Given a parameterized type construct, return a tuple of subclasses of + ``type`` representing all possible alternatives that can pass for that + construct at runtime. The return value is meant to be used as the second + argument to the ``isinstance`` or ``issubclass`` built-ins. >>> reify(int) - + (,) >>> reify(Union[int]) - + (,) >>> reify(str | int) (, ) @@ -191,31 +183,29 @@ def reify(t): ... ValueError: ('Not a reifiable generic type', typing.Union) """ - # While `int | str` constructs a `UnionType` instance, `Union[str, int]` - # constructs an instance of `Union`, so we need to handle both. - origin = get_origin(t) - if origin in (UnionType, Union): - def f(t): + + def reify(t): + while isinstance(t, TypeAliasType): + t = t.__value__ + o = get_origin(t) + # While `int | str` constructs a `UnionType` instance, `Union[str, int]` + # constructs an instance of `Union`, so we need to handle both. + if o in (UnionType, Union): for a in get_args(t): - o = get_origin(a) - if o in (UnionType, Union): - # handle Union of Union - yield from f(a) - else: - yield a if o is None else o - - return tuple(OrderedSet(f(t))) - elif origin is not None: - return origin - elif t.__module__ == 'typing': - raise ValueError('Not a reifiable generic type', t) - else: - return t - - -def get_generic_type_params(cls: type[Generic], + yield from reify(a) + elif o is not None: + yield o + elif t.__module__ == 'typing': + raise ValueError('Not a reifiable generic type', t) + else: + yield t + + return tuple(OrderedSet(reify(t))) + + +def get_generic_type_params(cls: type, *required_types: type - ) -> Sequence[type | TypeVar | ForwardRef]: + ) -> tuple[type | TypeVar | ForwardRef, ...]: """ Inspect and validate the type parameters of a subclass of `typing.Generic`. @@ -224,9 +214,7 @@ def get_generic_type_params(cls: type[Generic], inspected class's definition. `*required_types` can be used to assert the superclasses of parameters that are types. - >>> from typing import Generic - >>> T = TypeVar(name='T') - >>> class A(Generic[T]): + >>> class A[T]: ... pass >>> class B(A[int]): ... pass @@ -234,10 +222,10 @@ def get_generic_type_params(cls: type[Generic], ... pass >>> get_generic_type_params(A) - (~T,) + (T,) >>> get_generic_type_params(A, str) - (~T,) + (T,) >>> get_generic_type_params(B) (,) From 5413cee79ae61f6ebf1b7676c34e9130705f441c Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 02/24] Add one use of Self --- src/azul/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azul/__init__.py b/src/azul/__init__.py index f33e5eacb..970ca46be 100644 --- a/src/azul/__init__.py +++ b/src/azul/__init__.py @@ -883,7 +883,7 @@ def it_catalog(self) -> CatalogName: return name @classmethod - def from_json(cls, name: str, spec: JSON) -> 'Config.Catalog': + def from_json(cls, name: str, spec: JSON) -> Self: plugins = { plugin_type: cls.Plugin(**plugin_spec) for plugin_type, plugin_spec in spec['plugins'].items() From 4eed10398e953b470a743e56490f7a6b92299ab1 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 03/24] [p] Cover azul.collection with mypy (#6821) --- .mypy.ini | 3 +- src/azul/collections.py | 65 ++++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index 5bf40f04b..608ba00e8 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -3,4 +3,5 @@ warn_unused_configs = True allow_redefinition = True explicit_package_bases = True modules = - azul.types \ No newline at end of file + azul.types, + azul.collections \ No newline at end of file diff --git a/src/azul/collections.py b/src/azul/collections.py index 3cc699515..c60152cd0 100644 --- a/src/azul/collections.py +++ b/src/azul/collections.py @@ -21,8 +21,10 @@ Any, Callable, Protocol, + Self, TypeVar, Union, + overload, ) @@ -47,7 +49,7 @@ def dict_merge(dicts: Iterable[Mapping]) -> dict: # noinspection PyPep8Naming -class deep_dict_merge: +class deep_dict_merge[K, V](dict): """ Recursively merge the given dictionaries. If more than one dictionary contains a given key, and all values associated with this key are themselves @@ -86,29 +88,29 @@ class deep_dict_merge: {} """ - def __new__(cls, *dicts: Mapping) -> dict: - return cls.from_iterable(dicts) + def __init__(self, *maps: Mapping[K, V]): + super().__init__() + self.merge(maps) @classmethod - def from_iterable(cls, dicts: Iterable[Mapping], /) -> dict: - merged = {} - for m in dicts: + def from_iterable(cls, maps: Iterable[Mapping[K, V]], /) -> Self: + self = cls() + self.merge(maps) + return self + + def merge(self, maps: Iterable[Mapping[K, V]]): + for m in maps: for k, v2 in m.items(): - v1 = merged.setdefault(k, v2) + v1 = self.setdefault(k, v2) if v1 != v2: if isinstance(v1, Mapping) and isinstance(v2, Mapping): - merged[k] = deep_dict_merge(v1, v2) + self[k] = type(self)(v1, v2) else: raise ValueError(f'{v1!r} != {v2!r}') - return merged - -K = TypeVar('K') -V = TypeVar('V') - -def explode_dict(d: Mapping[K, Union[V, list[V], set[V], tuple[V]]] - ) -> Iterable[dict[K, V]]: +def explode_dict[K, V](d: Mapping[K, Union[V, list[V], set[V], tuple[V]]] + ) -> Iterable[dict[K, V]]: """ An iterable of dictionaries, one dictionary for every possible combination of items from iterable values in the argument dictionary. Only instances of @@ -132,7 +134,7 @@ def explode_dict(d: Mapping[K, Union[V, list[V], set[V], tuple[V]]] yield dict(zip(d.keys(), t)) -def none_safe_apply(f: Callable[[K], V], o: K | None) -> V | None: +def none_safe_apply[K, V](f: Callable[[K], V], o: K | None) -> V | None: """ >>> none_safe_apply(str, 123) '123' @@ -243,10 +245,20 @@ def compose_keys(f: Callable, g: Callable) -> Callable: return lambda v: f(g(v)) -def adict(seq: Union[Mapping[K, V], Iterable[tuple[K, V]]] = None, - /, - **kwargs: V - ) -> dict[K, V]: +@overload +def adict[K, V](seq: Mapping[K, V] | Iterable[tuple[K, V]] | None = None, + / + ) -> dict[K, V]: ... + + +@overload +def adict[K, V](seq: Mapping[str, V] | Iterable[tuple[str, V]] | None = None, + /, + **kwargs: V + ) -> dict[str, V]: ... + + +def adict(seq=None, /, **kwargs): """ Like dict() but ignores keyword arguments that are None. Really only useful for literals. May be inefficient for large arguments. @@ -286,7 +298,7 @@ def _athing(cls: type, *args): return cls(arg for arg in args if arg is not None) -def atuple(*args: V) -> tuple[V, ...]: +def atuple[V](*args: V) -> tuple[V, ...]: """ >>> atuple() () @@ -300,7 +312,7 @@ def atuple(*args: V) -> tuple[V, ...]: return _athing(tuple, *args) -def alist(*args: V) -> list[V]: +def alist[V](*args: V) -> list[V]: """ >>> alist() [] @@ -314,7 +326,7 @@ def alist(*args: V) -> list[V]: return _athing(list, *args) -def aset(*args: V) -> set[V]: +def aset[V](*args: V) -> set[V]: """ >>> aset() set() @@ -379,7 +391,8 @@ def __getitem__(self, key: _KT_contra, /) -> _VT_co: ... def getitem(d: SupportsGetItem[_KT_contra, _VT_co], k: _KT_contra, /, - default: _VT_co | None = None) -> _VT_co: + default: _VT_co | None = None + ) -> _VT_co | None: """ For mappings that implement ``.__getitem__()`` but forego the recommended implementation of ``.get()``: @@ -426,7 +439,7 @@ def getitem(d: SupportsGetItem[_KT_contra, _VT_co], return default -class OrderedSet(MutableSet[K]): +class OrderedSet[K](MutableSet[K]): """ A mutable set that maintains insertion order. Unlike similar implementations of the same name floating around on the internet, it is not a sequence. @@ -487,7 +500,7 @@ def __eq__(self, other: Any) -> bool: """ return self.inner.keys() == other - def __contains__(self, member: K) -> bool: + def __contains__(self, member) -> bool: """ >>> 'a' in OrderedSet(['a', 'b']) True From b181584a8584d7df72d522e666d2031f841d2cc4 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 04/24] [p] Cover azul.args and azul.attrs with mypy (#6821) --- .mypy.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.mypy.ini b/.mypy.ini index 608ba00e8..baab6e5a6 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -4,4 +4,6 @@ allow_redefinition = True explicit_package_bases = True modules = azul.types, - azul.collections \ No newline at end of file + azul.collections, + azul.args, + azul.attrs \ No newline at end of file From 76ad6577963b6ae1b2ec91eb442bbdc0fda1a692 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 05/24] [p] Cover azul.auth with mypy (#6821) --- .mypy.ini | 3 +-- src/azul/auth.py | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index baab6e5a6..f29dd4fd4 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -5,5 +5,4 @@ explicit_package_bases = True modules = azul.types, azul.collections, - azul.args, - azul.attrs \ No newline at end of file + azul.auth \ No newline at end of file diff --git a/src/azul/auth.py b/src/azul/auth.py index b84331776..a021397d2 100644 --- a/src/azul/auth.py +++ b/src/azul/auth.py @@ -7,7 +7,6 @@ ) from typing import ( ClassVar, - Type, ) import attr @@ -68,9 +67,10 @@ def to_json(self) -> JSON: def from_json(cls, json: JSON) -> 'Authentication': json = copy_json(json) cls_name = json.pop(cls._cls_field) + assert isinstance(cls_name, str) return cls._cls_for_name[cls_name](**json) - _cls_for_name: ClassVar[dict[str, Type['Authentication']]] = {} + _cls_for_name: ClassVar[dict[str, type['Authentication']]] = {} def __init_subclass__(cls) -> None: super().__init_subclass__() From 51ada9886a0be40d04ba60dbac3206af53390938 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:21 -0800 Subject: [PATCH 06/24] [p] Cover azul.azulclient with mypy (#6821) --- .mypy.ini | 11 ++++++++++- src/azul/azulclient.py | 28 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index f29dd4fd4..bc47bf1aa 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -5,4 +5,13 @@ explicit_package_bases = True modules = azul.types, azul.collections, - azul.auth \ No newline at end of file + azul.args, + azul.attrs, + azul.auth, + azul.azulclient + +[mypy-furl.*] +follow_untyped_imports = True + +[mypy-requests.*] +follow_untyped_imports = True \ No newline at end of file diff --git a/src/azul/azulclient.py b/src/azul/azulclient.py index 5917dfc53..377b18b6d 100644 --- a/src/azul/azulclient.py +++ b/src/azul/azulclient.py @@ -94,7 +94,7 @@ def notification(self, bundle_fqid: SourcedBundleFQID) -> JSON: # only variant that would ever occur in the wild. return { 'transaction_id': str(uuid.uuid4()), - 'bundle_fqid': bundle_fqid.to_json() + 'bundle_fqid': cast(JSON, bundle_fqid.to_json()) } def bundle_message(self, @@ -115,7 +115,7 @@ def reindex_message(self, return { 'action': 'reindex', 'catalog': catalog, - 'source': source.to_json(), + 'source': cast(JSON, source.to_json()), 'prefix': prefix } @@ -133,7 +133,7 @@ def index(self, notifications: Iterable[JSON], delete: bool = False ): - errors = defaultdict(int) + errors = defaultdict[int, int](int) missing = [] indexed = 0 total = 0 @@ -247,16 +247,16 @@ def remote_reindex(self, sources: Set[str]): plugin = self.repository_plugin(catalog) - for source in sources: - source = plugin.resolve_source(source) - source = plugin.partition_source(catalog, source) + for source_spec in sources: + source_ref = plugin.resolve_source(source_spec) + source_ref = plugin.partition_source(catalog, source_ref) def message(partition_prefix: str) -> JSON: - log.info('Remotely reindexing prefix %r of source %r into catalog %r', - partition_prefix, str(source.spec), catalog) - return self.reindex_message(catalog, source, partition_prefix) + log.info('Remotely reindexing prefix %r of source_ref %r into catalog %r', + partition_prefix, str(source_ref.spec), catalog) + return self.reindex_message(catalog, source_ref, partition_prefix) - messages = map(message, source.spec.prefix.partition_prefixes()) + messages = map(message, source_ref.spec.prefix.partition_prefixes()) for batch in chunked(messages, 10): entries = [ dict(Id=str(i), MessageBody=json.dumps(message)) @@ -265,8 +265,8 @@ def message(partition_prefix: str) -> JSON: self.notifications_queue.send_messages(Entries=entries) def remote_reindex_partition(self, message: JSON) -> None: - catalog = message['catalog'] - prefix = message['prefix'] + catalog, prefix = message['catalog'], message['prefix'] + assert isinstance(catalog, str) and isinstance(prefix, str) # FIXME: Adopt `trycast` for casting JSON to TypeDict # https://github.com/DataBiosphere/azul/issues/5171 source = cast(SourceJSON, message['source']) @@ -386,11 +386,11 @@ def group_key(fqid: SourcedBundleFQID): fqid.uuid.lower() ) - bundle_fqids = groupby(bundle_fqids, key=group_key) + groups = groupby(bundle_fqids, key=group_key) # Take the first item in each group. Because the oder is reversed, this # is the latest version - bundle_fqids = [next(group) for _, group in bundle_fqids] + bundle_fqids = [next(group) for _, group in groups] return bundle_fqids @cached_property From 4236d43f83c91999b406fce880091fd820c512f6 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Mon, 13 Jan 2025 22:35:38 -0800 Subject: [PATCH 07/24] [p] Cover azul.openapi with mypy (#6821) --- .mypy.ini | 2 ++ src/azul/openapi/params.py | 19 ++++++++----------- src/azul/openapi/schema.py | 38 +++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index bc47bf1aa..bccbb3149 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -9,6 +9,8 @@ modules = azul.attrs, azul.auth, azul.azulclient +packages = + azul.openapi [mypy-furl.*] follow_untyped_imports = True diff --git a/src/azul/openapi/params.py b/src/azul/openapi/params.py index 97b9d42f0..ed36c23b7 100644 --- a/src/azul/openapi/params.py +++ b/src/azul/openapi/params.py @@ -1,7 +1,3 @@ -from typing import ( - Union, -) - from azul.openapi import ( format_description_key, schema, @@ -36,7 +32,7 @@ def path(name: str, type_: TYPE, **kwargs: PrimitiveJSON) -> JSON: def query(name: str, - type_: Union[TYPE, schema.optional], + type_: TYPE | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: """ @@ -58,7 +54,7 @@ def query(name: str, def header(name: str, - type_: Union[TYPE, schema.optional], + type_: TYPE | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: """ @@ -81,18 +77,19 @@ def header(name: str, def _make_param(name: str, in_: str, - type_: Union[TYPE, schema.optional], + type_: TYPE | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: - is_optional = isinstance(type_, schema.optional) - if is_optional: - type_ = type_.type_ + if isinstance(type_, schema.optional): + type_, required = type_.type_, False + else: + required = True format_description_key(kwargs) schema_or_content = schema.make_type(type_) return { 'name': name, 'in': in_, - 'required': not is_optional, + 'required': required, # https://swagger.io/docs/specification/describing-parameters/#schema-vs-content 'content' if 'application/json' in schema_or_content else 'schema': schema_or_content, **kwargs diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index dbc0e6dca..ea3a61664 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -1,13 +1,8 @@ -from collections.abc import ( - Mapping, -) import re from typing import ( + Mapping, NamedTuple, - Optional, - Type, - TypeVar, - Union, + TypeAliasType, ) from more_itertools import ( @@ -15,6 +10,7 @@ ) from azul import ( + reject, require, ) from azul.types import ( @@ -29,7 +25,7 @@ need of manually maintaining the `required` schema property. """ -TYPE = Union[None, Type, str, JSON] +TYPE = None | type | str | JSON | TypeAliasType # noinspection PyPep8Naming @@ -48,7 +44,7 @@ class optional(NamedTuple): # noinspection PyShadowingBuiltins -def object(additional_properties=False, **props: Union[TYPE, optional]) -> JSON: +def object(additional_properties=False, **props: TYPE | optional) -> JSON: """ >>> from azul.doctests import assert_json >>> assert_json(object(x=int, y=int, relative=optional(bool))) @@ -213,7 +209,7 @@ def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: } -def pattern(regex: Union[str, re.Pattern], _type: TYPE = str) -> JSON: +def pattern(regex: str | re.Pattern, _type: TYPE = str) -> JSON: """ Returns schema for a JSON string matching the given pattern. @@ -252,12 +248,13 @@ def pattern(regex: Union[str, re.Pattern], _type: TYPE = str) -> JSON: def with_default(default: PrimitiveJSON, /, - type_: Optional[TYPE] = None + type_: TYPE = None ) -> JSON: """ Add a documented default value to the type schema. >>> from azul.doctests import assert_json + >>> assert_json(with_default('foo')) { "type": "string", @@ -277,13 +274,10 @@ def with_default(default: PrimitiveJSON, } -N = TypeVar('N', bound=Union[int, float]) - - -def in_range(minimum: Optional[N], - maximum: Optional[N], - type_: Optional[TYPE] = None - ) -> JSON: +def in_range[N: int | float](minimum: N | None, + maximum: N | None, + type_: TYPE = None + ) -> JSON: """ >>> from azul.doctests import assert_json @@ -338,7 +332,7 @@ def in_range(minimum: Optional[N], } -_primitive_types: Mapping[Optional[type], JSON] = { +_primitive_types: Mapping[type | None, JSON] = { str: {'type': 'string'}, bool: {'type': 'boolean'}, # Note that `format` on numeric types is an OpenAPI extension to JSONSchema @@ -504,6 +498,8 @@ def nullable(t: TYPE, for_openapi: bool = True) -> JSON: to `optional` from this module, which is used to indicate that a property may be absent from an object. + :param t: The schema or equivalent Python type to make nullable + :param for_openapi: True to emit OpenAPI 3.0 flavor of JSONSchema, False for vanilla JSONSchema @@ -526,8 +522,8 @@ def nullable(t: TYPE, for_openapi: bool = True) -> JSON: >>> nullable(str, for_openapi=False) {'type': ['null', 'string']} """ - require(t is not None or type(None)) + reject(t is None or t is type(None)) if for_openapi: - return make_type(t) | {'nullable': True} + return {**make_type(t), 'nullable': True} else: return union(None, t, for_openapi=False) From 79fc84d8729c4ad72ca7a44faea1177664c71261 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Tue, 14 Jan 2025 20:40:14 -0800 Subject: [PATCH 08/24] Rename schema.TYPE to schema.Form --- lambdas/service/app.py | 6 +-- src/azul/health.py | 2 +- src/azul/openapi/params.py | 22 +++++------ src/azul/openapi/responses.py | 6 +-- src/azul/openapi/schema.py | 74 +++++++++++++++++------------------ 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/lambdas/service/app.py b/lambdas/service/app.py index b70f56b37..20483b7db 100644 --- a/lambdas/service/app.py +++ b/lambdas/service/app.py @@ -879,7 +879,7 @@ def filter_schema(relation: str) -> JSON: catalog_param_spec = params.query( 'catalog', schema.optional(schema.with_default(app.catalog, - type_=schema.enum(*config.catalogs))), + form=schema.enum(*config.catalogs))), description='The name of the catalog to query.') @@ -894,7 +894,7 @@ def repository_search_params_spec(): ), params.query( 'size', - schema.optional(schema.with_default(10, type_=schema.in_range(min_page_size, None))), + schema.optional(schema.with_default(10, form=schema.in_range(min_page_size, None))), description=fd(''' The number of hits included per page. The maximum size allowed depends on the catalog and entity type. @@ -1302,7 +1302,7 @@ def manifest_route(*, fetch: bool, initiate: bool): format.value for format in app.metadata_plugin.manifest_formats ], - type_=str + form=str ) ), description=f''' diff --git a/src/azul/health.py b/src/azul/health.py index c8835befc..bb93a76e6 100644 --- a/src/azul/health.py +++ b/src/azul/health.py @@ -492,7 +492,7 @@ def fast_health(): 'parameters': [ params.path( 'keys', - type_=schema.array(schema.enum(*sorted(Health.all_keys))), + form=schema.array(schema.enum(*sorted(Health.all_keys))), description=''' A comma-separated list of keys selecting the health checks to be performed. Each key corresponds to an diff --git a/src/azul/openapi/params.py b/src/azul/openapi/params.py index ed36c23b7..8c0ee6cab 100644 --- a/src/azul/openapi/params.py +++ b/src/azul/openapi/params.py @@ -3,7 +3,7 @@ schema, ) from azul.openapi.schema import ( - TYPE, + Form, ) from azul.types import ( JSON, @@ -11,7 +11,7 @@ ) -def path(name: str, type_: TYPE, **kwargs: PrimitiveJSON) -> JSON: +def path(name: str, form: Form, **kwargs: PrimitiveJSON) -> JSON: """ Returns an OpenAPI `parameters` specification of a URL path parameter. Note that path parameters cannot be optional. @@ -28,11 +28,11 @@ def path(name: str, type_: TYPE, **kwargs: PrimitiveJSON) -> JSON: } } """ - return _make_param(name, in_='path', type_=type_, **kwargs) + return _make_param(name, in_='path', form=form, **kwargs) def query(name: str, - type_: TYPE | schema.optional, + form: Form | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: """ @@ -50,11 +50,11 @@ def query(name: str, } } """ - return _make_param(name, in_='query', type_=type_, **kwargs) + return _make_param(name, in_='query', form=form, **kwargs) def header(name: str, - type_: TYPE | schema.optional, + form: Form | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: """ @@ -72,20 +72,20 @@ def header(name: str, } } """ - return _make_param(name, in_='header', type_=type_, **kwargs) + return _make_param(name, in_='header', form=form, **kwargs) def _make_param(name: str, in_: str, - type_: TYPE | schema.optional, + form: Form | schema.optional, **kwargs: PrimitiveJSON ) -> JSON: - if isinstance(type_, schema.optional): - type_, required = type_.type_, False + if isinstance(form, schema.optional): + form, required = form.form, False else: required = True format_description_key(kwargs) - schema_or_content = schema.make_type(type_) + schema_or_content = schema.make_type(form) return { 'name': name, 'in': in_, diff --git a/src/azul/openapi/responses.py b/src/azul/openapi/responses.py index a9e44254f..307e95c15 100644 --- a/src/azul/openapi/responses.py +++ b/src/azul/openapi/responses.py @@ -4,7 +4,7 @@ schema, ) from azul.openapi.schema import ( - TYPE, + Form, ) from azul.types import ( AnyJSON, @@ -22,7 +22,7 @@ def json_content(schema: JSON, **kwargs: AnyJSON) -> JSON: } -def header(type_: TYPE, **kwargs: PrimitiveJSON) -> JSON: +def header(form: Form, **kwargs: PrimitiveJSON) -> JSON: """ Returns the schema and description for a response header. @@ -38,6 +38,6 @@ def header(type_: TYPE, **kwargs: PrimitiveJSON) -> JSON: """ format_description_key(kwargs) return { - 'schema': schema.make_type(type_), + 'schema': schema.make_type(form), **kwargs } diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index ea3a61664..c74d92b1b 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -25,7 +25,7 @@ need of manually maintaining the `required` schema property. """ -TYPE = None | type | str | JSON | TypeAliasType +Form = None | type | str | JSON | TypeAliasType # noinspection PyPep8Naming @@ -33,7 +33,7 @@ class optional(NamedTuple): """ Use in conjunction with `object` to mark certain properties as optional. """ - type_: TYPE + form: Form # We're consciously shadowing the `object` builtin here. Two factors mitigate @@ -44,7 +44,7 @@ class optional(NamedTuple): # noinspection PyShadowingBuiltins -def object(additional_properties=False, **props: TYPE | optional) -> JSON: +def object(additional_properties=False, **props: Form | optional) -> JSON: """ >>> from azul.doctests import assert_json >>> assert_json(object(x=int, y=int, relative=optional(bool))) @@ -83,7 +83,7 @@ def object(additional_properties=False, **props: TYPE | optional) -> JSON: if name.endswith('_'): name = name[:-1] if isinstance(prop, optional): - prop = prop.type_ + prop = prop.form else: required.append(name) new_props[name] = prop @@ -92,7 +92,7 @@ def object(additional_properties=False, **props: TYPE | optional) -> JSON: additionalProperties=additional_properties) -def properties(**props: TYPE) -> JSON: +def properties(**props: Form) -> JSON: """ Returns a JSON schema `properties` attribute value. @@ -111,7 +111,7 @@ def properties(**props: TYPE) -> JSON: return {name: make_type(prop) for name, prop in props.items()} -def array(item: TYPE, *items: TYPE, **kwargs) -> JSON: +def array(item: Form, *items: Form, **kwargs) -> JSON: """ Returns the schema for an array of items of a given type, or a sequence of types. @@ -137,7 +137,7 @@ def array(item: TYPE, *items: TYPE, **kwargs) -> JSON: return array_type(make_type(item), *map(make_type, items), **kwargs) -def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: +def enum(*items: PrimitiveJSON, form: Form = None) -> JSON: """ Returns an `enum` schema for the given items. By default, the schema type of the items is inferred, but a type may be passed explicitly to override that. @@ -145,7 +145,7 @@ def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: types of the enum values contradict the explicit type. >>> from azul.doctests import assert_json - >>> assert_json(enum('foo', 'bar', type_=str)) + >>> assert_json(enum('foo', 'bar', form=str)) { "type": "string", "enum": [ @@ -165,7 +165,7 @@ def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: ] } - >>> assert_json(enum('x', type_={'type': 'string'})) + >>> assert_json(enum('x', form={'type': 'string'})) { "type": "string", "enum": [ @@ -178,12 +178,12 @@ def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: ... ValueError: Expected exactly one item in iterable, but got , , and perhaps more. - >>> enum('foo', 'bar', type_=int) + >>> enum('foo', 'bar', form=int) Traceback (most recent call last): ... AssertionError - >>> assert_json(enum('foo', 'bar', type_="integer")) + >>> assert_json(enum('foo', 'bar', form="integer")) { "type": "integer", "enum": [ @@ -193,23 +193,23 @@ def enum(*items: PrimitiveJSON, type_: TYPE = None) -> JSON: } """ - if isinstance(type_, type): - assert all(isinstance(item, type_) for item in items) + if isinstance(form, type): + assert all(isinstance(item, form) for item in items) else: inferred_type = one(set(map(type, items))) - if type_ is None: - type_ = inferred_type + if form is None: + form = inferred_type else: # Can't easily verify type when passed as string or mapping pass return { - **make_type(type_), + **make_type(form), 'enum': items } -def pattern(regex: str | re.Pattern, _type: TYPE = str) -> JSON: +def pattern(regex: str | re.Pattern, _type: Form = str) -> JSON: """ Returns schema for a JSON string matching the given pattern. @@ -248,7 +248,7 @@ def pattern(regex: str | re.Pattern, _type: TYPE = str) -> JSON: def with_default(default: PrimitiveJSON, /, - type_: TYPE = None + form: Form = None ) -> JSON: """ Add a documented default value to the type schema. @@ -261,7 +261,7 @@ def with_default(default: PrimitiveJSON, "default": "foo" } - >>> assert_json(with_default(0, type_=float)) + >>> assert_json(with_default(0, form=float)) { "type": "number", "format": "double", @@ -269,14 +269,14 @@ def with_default(default: PrimitiveJSON, } """ return { - **make_type(type(default) if type_ is None else type_), + **make_type(type(default) if form is None else form), 'default': default } def in_range[N: int | float](minimum: N | None, maximum: N | None, - type_: TYPE = None + form: Form = None ) -> JSON: """ >>> from azul.doctests import assert_json @@ -318,15 +318,15 @@ def in_range[N: int | float](minimum: N | None, ... azul.RequirementError: Must pass at least one bound """ - if type_ is None: + if form is None: types = (type(minimum), type(maximum)) set_of_types = set(types) set_of_types.discard(type(None)) require(bool(set_of_types), 'Must pass at least one bound') require(len(set_of_types) == 1, 'Mismatched argument types', *types) - type_ = one(set_of_types) + form = one(set_of_types) return { - **make_type(type_), + **make_type(form), **({} if minimum is None else {'minimum': minimum}), **({} if maximum is None else {'maximum': maximum}) } @@ -404,7 +404,7 @@ def array_type(item: JSON, *items: JSON, **kwargs) -> JSON: } -def make_type(t: TYPE) -> JSON: +def make_type(form: Form) -> JSON: """ Returns the schema for a Python primitive type such as `int` or a JSON schema type name such as `"boolean"`. @@ -443,21 +443,21 @@ def make_type(t: TYPE) -> JSON: >>> make_type(None) {'type': 'null'} """ - if t == JSON: + if form == JSON: return {'type': 'object'} - elif t is None: - return _primitive_types[type(t)] - elif isinstance(t, type): - return _primitive_types[t] - elif isinstance(t, str): - return {'type': t} - elif isinstance(t, reify(JSON)): - return t + elif form is None: + return _primitive_types[type(form)] + elif isinstance(form, type): + return _primitive_types[form] + elif isinstance(form, str): + return {'type': form} + elif isinstance(form, reify(JSON)): + return form else: - assert False, type(t) + assert False, type(form) -def union(*ts: TYPE, for_openapi: bool = True) -> JSON: +def union(*ts: Form, for_openapi: bool = True) -> JSON: """ The union of one or more types. @@ -490,7 +490,7 @@ def union(*ts: TYPE, for_openapi: bool = True) -> JSON: return {'anyOf': ts} -def nullable(t: TYPE, for_openapi: bool = True) -> JSON: +def nullable(t: Form, for_openapi: bool = True) -> JSON: """ Given a schema, return a schema that additionally permits the `null` value. From 5b9b0b94671499e6865615c699a463c8185145c0 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Tue, 14 Jan 2025 20:53:17 -0800 Subject: [PATCH 09/24] Rename schema.make_type to schema.make and schema.schema --- src/azul/indexer/document.py | 6 +++--- src/azul/openapi/params.py | 2 +- src/azul/openapi/responses.py | 2 +- src/azul/openapi/schema.py | 37 +++++++++++++++++++---------------- test/test_openapi.py | 2 +- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/azul/indexer/document.py b/src/azul/indexer/document.py index fe5430967..edfa5657d 100644 --- a/src/azul/indexer/document.py +++ b/src/azul/indexer/document.py @@ -676,7 +676,7 @@ def api_schema(self) -> JSON: """ The JSONSchema describing fields of this type in OpenAPI specifications. """ - return schema.make_type(self.native_type) + return schema.schema(self.native_type) def from_api(self, value: AnyJSON) -> N: """ @@ -820,7 +820,7 @@ def from_index(self, value: T) -> N: @property def api_schema(self) -> JSON: - return schema.nullable(schema.make_type(self.optional_type)) + return schema.nullable(schema.make(self.optional_type)) class NullableScalar(Nullable[N, T], metaclass=ABCMeta): @@ -828,7 +828,7 @@ class NullableScalar(Nullable[N, T], metaclass=ABCMeta): def api_filter_schema(self, relation: str) -> JSON: if relation == 'within': # The LHS operand of a range relation can't be null - api_type = schema.make_type(self.optional_type) + api_type = schema.make(self.optional_type) return self._api_range_schema(api_type) else: return super().api_filter_schema(relation) diff --git a/src/azul/openapi/params.py b/src/azul/openapi/params.py index 8c0ee6cab..781011d70 100644 --- a/src/azul/openapi/params.py +++ b/src/azul/openapi/params.py @@ -85,7 +85,7 @@ def _make_param(name: str, else: required = True format_description_key(kwargs) - schema_or_content = schema.make_type(form) + schema_or_content = schema.make(form) return { 'name': name, 'in': in_, diff --git a/src/azul/openapi/responses.py b/src/azul/openapi/responses.py index 307e95c15..b3911518e 100644 --- a/src/azul/openapi/responses.py +++ b/src/azul/openapi/responses.py @@ -38,6 +38,6 @@ def header(form: Form, **kwargs: PrimitiveJSON) -> JSON: """ format_description_key(kwargs) return { - 'schema': schema.make_type(form), + 'schema': schema.make(form), **kwargs } diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index c74d92b1b..4edd75e55 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -97,7 +97,7 @@ def properties(**props: Form) -> JSON: Returns a JSON schema `properties` attribute value. >>> from azul.doctests import assert_json - >>> assert_json(properties(x=make_type(int), y=make_type(bool))) + >>> assert_json(properties(x=schema(int), y=schema(bool))) { "x": { "type": "integer", @@ -108,7 +108,7 @@ def properties(**props: Form) -> JSON: } } """ - return {name: make_type(prop) for name, prop in props.items()} + return {name: schema(prop) for name, prop in props.items()} def array(item: Form, *items: Form, **kwargs) -> JSON: @@ -134,7 +134,7 @@ def array(item: Form, *items: Form, **kwargs) -> JSON: "additionalItems": true } """ - return array_type(make_type(item), *map(make_type, items), **kwargs) + return array_type(schema(item), *map(schema, items), **kwargs) def enum(*items: PrimitiveJSON, form: Form = None) -> JSON: @@ -204,7 +204,7 @@ def enum(*items: PrimitiveJSON, form: Form = None) -> JSON: pass return { - **make_type(form), + **schema(form), 'enum': items } @@ -241,7 +241,7 @@ def pattern(regex: str | re.Pattern, _type: Form = str) -> JSON: regex = regex.pattern assert isinstance(regex, str) return { - **make_type(_type), + **schema(_type), 'pattern': regex } @@ -269,7 +269,7 @@ def with_default(default: PrimitiveJSON, } """ return { - **make_type(type(default) if form is None else form), + **schema(type(default) if form is None else form), 'default': default } @@ -326,7 +326,7 @@ def in_range[N: int | float](minimum: N | None, require(len(set_of_types) == 1, 'Mismatched argument types', *types) form = one(set_of_types) return { - **make_type(form), + **schema(form), **({} if minimum is None else {'minimum': minimum}), **({} if maximum is None else {'maximum': maximum}) } @@ -404,43 +404,43 @@ def array_type(item: JSON, *items: JSON, **kwargs) -> JSON: } -def make_type(form: Form) -> JSON: +def schema(form: Form) -> JSON: """ Returns the schema for a Python primitive type such as `int` or a JSON schema type name such as `"boolean"`. For primitive JSON types, the corresponding Python types can be used: - >>> make_type(int) + >>> schema(int) {'type': 'integer', 'format': 'int64'} This is the most concise way of specifying a string schema: - >>> make_type(str) + >>> schema(str) {'type': 'string'} - >>> make_type(JSON) + >>> schema(JSON) {'type': 'object'} A JSON schema type name may be used instead: - >>> make_type('string') + >>> schema('string') {'type': 'string'} When a dictionary is passed, it is returned verbatim. This is useful in conjunction with the `properties` helper: - >>> make_type({'type': 'string'}) + >>> schema({'type': 'string'}) {'type': 'string'} For the JSON null schema, pass `type(None)` … - >>> make_type(type(None)) + >>> schema(type(None)) {'type': 'null'} … or just `None`. - >>> make_type(None) + >>> schema(None) {'type': 'null'} """ if form == JSON: @@ -457,6 +457,9 @@ def make_type(form: Form) -> JSON: assert False, type(form) +make = schema + + def union(*ts: Form, for_openapi: bool = True) -> JSON: """ The union of one or more types. @@ -480,7 +483,7 @@ def union(*ts: Form, for_openapi: bool = True) -> JSON: >>> union(str, int, for_openapi=False) {'anyOf': [{'type': 'string'}, {'type': 'integer', 'format': 'int64'}]} """ - ts = list(map(make_type, ts)) + ts = list(map(schema, ts)) # There are two ways to represent a union of types in JSONSchema, … if not for_openapi and all(len(t) == 1 and isinstance(t.get('type'), str) for t in ts): # … a shortcut for simple types … @@ -524,6 +527,6 @@ def nullable(t: Form, for_openapi: bool = True) -> JSON: """ reject(t is None or t is type(None)) if for_openapi: - return {**make_type(t), 'nullable': True} + return {**schema(t), 'nullable': True} else: return union(None, t, for_openapi=False) diff --git a/test/test_openapi.py b/test/test_openapi.py index e37643819..986033e5c 100644 --- a/test/test_openapi.py +++ b/test/test_openapi.py @@ -277,7 +277,7 @@ def test_misuse(self): # wrapper. try: # noinspection PyTypeChecker - schema.make_type(schema.optional(str)) + schema.make(schema.optional(str)) except AssertionError as e: self.assertIn(schema.optional, e.args) else: From 49c9221745fd7fc1fae2232b0a13d5ceedad62ed Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Tue, 14 Jan 2025 20:57:39 -0800 Subject: [PATCH 10/24] Rename schema.in_range to schema.range --- lambdas/service/app.py | 2 +- src/azul/openapi/schema.py | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lambdas/service/app.py b/lambdas/service/app.py index 20483b7db..cf4caf2e5 100644 --- a/lambdas/service/app.py +++ b/lambdas/service/app.py @@ -894,7 +894,7 @@ def repository_search_params_spec(): ), params.query( 'size', - schema.optional(schema.with_default(10, form=schema.in_range(min_page_size, None))), + schema.optional(schema.with_default(10, form=schema.range(min_page_size, None))), description=fd(''' The number of hits included per page. The maximum size allowed depends on the catalog and entity type. diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index 4edd75e55..018f35fd5 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -274,14 +274,14 @@ def with_default(default: PrimitiveJSON, } -def in_range[N: int | float](minimum: N | None, - maximum: N | None, - form: Form = None - ) -> JSON: +def range[N: int | float](minimum: N | None, + maximum: N | None, + form: Form = None + ) -> JSON: """ >>> from azul.doctests import assert_json - >>> assert_json(in_range(1, 2)) + >>> assert_json(range(1, 2)) { "type": "integer", "format": "int64", @@ -289,31 +289,31 @@ def in_range[N: int | float](minimum: N | None, "maximum": 2 } - >>> assert_json(in_range(.5, None)) + >>> assert_json(range(.5, None)) { "type": "number", "format": "double", "minimum": 0.5 } - >>> assert_json(in_range(None, 2.0)) + >>> assert_json(range(None, 2.0)) { "type": "number", "format": "double", "maximum": 2.0 } - >>> assert_json(in_range(minimum=.5, maximum=2)) + >>> assert_json(range(minimum=.5, maximum=2)) Traceback (most recent call last): ... azul.RequirementError: ('Mismatched argument types', , ) - >>> assert_json(in_range()) + >>> assert_json(range()) Traceback (most recent call last): ... - TypeError: in_range() missing 2 required positional arguments: 'minimum' and 'maximum' + TypeError: range() missing 2 required positional arguments: 'minimum' and 'maximum' - >>> assert_json(in_range(None, None)) + >>> assert_json(range(None, None)) Traceback (most recent call last): ... azul.RequirementError: Must pass at least one bound From 8330b628228aeeee28eb0242a77c0c804d54014e Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Tue, 14 Jan 2025 21:02:31 -0800 Subject: [PATCH 11/24] Rename schema.with_default to schema.default --- lambdas/service/app.py | 6 +++--- src/azul/openapi/schema.py | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lambdas/service/app.py b/lambdas/service/app.py index cf4caf2e5..3e88d46b4 100644 --- a/lambdas/service/app.py +++ b/lambdas/service/app.py @@ -878,8 +878,8 @@ def filter_schema(relation: str) -> JSON: catalog_param_spec = params.query( 'catalog', - schema.optional(schema.with_default(app.catalog, - form=schema.enum(*config.catalogs))), + schema.optional(schema.default(app.catalog, + form=schema.enum(*config.catalogs))), description='The name of the catalog to query.') @@ -894,7 +894,7 @@ def repository_search_params_spec(): ), params.query( 'size', - schema.optional(schema.with_default(10, form=schema.range(min_page_size, None))), + schema.optional(schema.default(10, form=schema.range(min_page_size, None))), description=fd(''' The number of hits included per page. The maximum size allowed depends on the catalog and entity type. diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index 018f35fd5..04b6f4d2e 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -246,22 +246,19 @@ def pattern(regex: str | re.Pattern, _type: Form = str) -> JSON: } -def with_default(default: PrimitiveJSON, - /, - form: Form = None - ) -> JSON: +def default(default: PrimitiveJSON, /, form: Form = None) -> JSON: """ Add a documented default value to the type schema. >>> from azul.doctests import assert_json - >>> assert_json(with_default('foo')) + >>> assert_json(default('foo')) { "type": "string", "default": "foo" } - >>> assert_json(with_default(0, form=float)) + >>> assert_json(default(0, form=float)) { "type": "number", "format": "double", From f244f5f12295a723add74e4394fb3b95219ecf9a Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Tue, 14 Jan 2025 21:41:07 -0800 Subject: [PATCH 12/24] Inline schema.properties() --- src/azul/openapi/schema.py | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index 04b6f4d2e..4d7bbd25d 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -44,7 +44,7 @@ class optional(NamedTuple): # noinspection PyShadowingBuiltins -def object(additional_properties=False, **props: Form | optional) -> JSON: +def object(additional_properties=False, **properties: Form | optional) -> JSON: """ >>> from azul.doctests import assert_json >>> assert_json(object(x=int, y=int, relative=optional(bool))) @@ -77,40 +77,20 @@ def object(additional_properties=False, **props: Form | optional) -> JSON: "additionalProperties": false } """ - new_props = {} - required = [] - for name, prop in props.items(): + properties, required, items = {}, [], properties.items() + for name, value in items: if name.endswith('_'): name = name[:-1] - if isinstance(prop, optional): - prop = prop.form + if isinstance(value, optional): + value = value.form else: required.append(name) - new_props[name] = prop - return object_type(properties(**new_props), + properties[name] = schema(value) + return object_type(properties, **(dict(required=required) if required else {}), additionalProperties=additional_properties) -def properties(**props: Form) -> JSON: - """ - Returns a JSON schema `properties` attribute value. - - >>> from azul.doctests import assert_json - >>> assert_json(properties(x=schema(int), y=schema(bool))) - { - "x": { - "type": "integer", - "format": "int64" - }, - "y": { - "type": "boolean" - } - } - """ - return {name: schema(prop) for name, prop in props.items()} - - def array(item: Form, *items: Form, **kwargs) -> JSON: """ Returns the schema for an array of items of a given type, or a sequence of From d287d887d19261795a9b639b410f688e6445146a Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Wed, 15 Jan 2025 21:21:42 -0800 Subject: [PATCH 13/24] Unify schema.object and schema.object_type --- lambdas/service/app.py | 10 +-- src/azul/health.py | 4 +- src/azul/indexer/document.py | 2 +- src/azul/openapi/schema.py | 89 +++++++++++++++----------- src/azul/service/catalog_controller.py | 6 +- 5 files changed, 61 insertions(+), 50 deletions(-) diff --git a/lambdas/service/app.py b/lambdas/service/app.py index 3e88d46b4..665159e0b 100644 --- a/lambdas/service/app.py +++ b/lambdas/service/app.py @@ -789,10 +789,10 @@ def list_catalogs(): return app.catalog_controller.list_catalogs() -generic_object_spec = schema.object(additional_properties=True) +generic_object_spec = schema.object(additionalProperties=True) array_of_object_spec = schema.array(generic_object_spec) hit_spec = schema.object( - additional_properties=True, + additionalProperties=True, protocols=array_of_object_spec, entryId=str, sources=array_of_object_spec, @@ -815,7 +815,7 @@ def _filter_schema(field_type: FieldType) -> JSON: relations = field_type.supported_filter_relations def filter_schema(relation: str) -> JSON: - return schema.object_type( + return schema.object( properties={relation: schema.array(field_type.api_filter_schema(relation))}, required=[relation], additionalProperties=False @@ -831,7 +831,7 @@ def filter_schema(relation: str) -> JSON: filters_param_spec = params.query( 'filters', - schema.optional(application_json(schema.object_type( + schema.optional(application_json(schema.object( default='{}', example={'cellCount': {'within': [[10000, 1000000000]]}}, properties={ @@ -1152,7 +1152,7 @@ def _hoist_parameters(query_params, request): '''), **responses.json_content( schema.object( - additional_properties=True, + additionalProperties=True, organTypes=schema.array(str), totalFileSize=float, fileTypeSummaries=array_of_object_spec, diff --git a/src/azul/health.py b/src/azul/health.py index bb93a76e6..aa018f9f4 100644 --- a/src/azul/health.py +++ b/src/azul/health.py @@ -379,8 +379,8 @@ def _health_spec(health_keys: dict) -> JSON: ''') if len(health_keys) > 1 else ''), **responses.json_content( schema.object( - additional_properties=schema.object( - additional_properties=True, + additionalProperties=schema.object( + additionalProperties=True, up=schema.enum(up) ), up=schema.enum(up) diff --git a/src/azul/indexer/document.py b/src/azul/indexer/document.py index edfa5657d..eac32e54d 100644 --- a/src/azul/indexer/document.py +++ b/src/azul/indexer/document.py @@ -990,7 +990,7 @@ def api_filter_schema(self, relation: str) -> JSON: kwargs = dict(additionalProperties=False) if required: kwargs['required'] = required - return schema.object_type(properties, **kwargs) + return schema.object(properties=properties, **kwargs) def filter(self, relation: str, values: list[JSON]) -> list[JSON]: nested_object = one(values) diff --git a/src/azul/openapi/schema.py b/src/azul/openapi/schema.py index 4d7bbd25d..3a54c3e59 100644 --- a/src/azul/openapi/schema.py +++ b/src/azul/openapi/schema.py @@ -3,6 +3,7 @@ Mapping, NamedTuple, TypeAliasType, + overload, ) from more_itertools import ( @@ -14,6 +15,7 @@ require, ) from azul.types import ( + AnyJSON, JSON, PrimitiveJSON, reify, @@ -42,9 +44,23 @@ class optional(NamedTuple): # wholesale and its members referenced by fully qualifying their name so the # `object` builtin is not shadowed in the importing module. +# noinspection PyShadowingBuiltins,PyPep8Naming +@overload +def object(*, + additionalProperties: JSON | bool = False, + **properties: Form | optional) -> JSON: ... -# noinspection PyShadowingBuiltins -def object(additional_properties=False, **properties: Form | optional) -> JSON: + +# noinspection PyShadowingBuiltins,PyPep8Naming +@overload +def object(*, properties: JSON, **kwargs: AnyJSON) -> JSON: ... + + +# noinspection PyShadowingBuiltins,PyPep8Naming +def object(*, + properties=None, + additionalProperties=None, + **kwargs) -> JSON: """ >>> from azul.doctests import assert_json >>> assert_json(object(x=int, y=int, relative=optional(bool))) @@ -76,19 +92,39 @@ def object(additional_properties=False, **properties: Form | optional) -> JSON: "properties": {}, "additionalProperties": false } + + >>> object(x=int, y=int, relative=optional(bool)) == object( + ... properties=dict(x=dict(type="integer", format="int64"), + ... y=dict(type="integer", format="int64"), + ... relative=dict(type="boolean")), + ... additionalProperties=False, + ... required=['x','y'] + ... ) + True """ - properties, required, items = {}, [], properties.items() - for name, value in items: - if name.endswith('_'): - name = name[:-1] - if isinstance(value, optional): - value = value.form - else: - required.append(name) - properties[name] = schema(value) - return object_type(properties, - **(dict(required=required) if required else {}), - additionalProperties=additional_properties) + + if properties is None: + properties, required = {}, [] + for name, value in kwargs.items(): + if name.endswith('_'): + name = name[:-1] + if isinstance(value, optional): + value = value.form + else: + required.append(name) + properties[name] = schema(value) + kwargs = {'required': required} if required else {} + if additionalProperties is None: + additionalProperties = False + kwargs['additionalProperties'] = additionalProperties + else: + if additionalProperties is not None: + kwargs['additionalProperties'] = additionalProperties + return { + 'type': 'object', + 'properties': properties, + **kwargs, + } def array(item: Form, *items: Form, **kwargs) -> JSON: @@ -328,31 +364,6 @@ def range[N: int | float](minimum: N | None, } -def object_type(properties: JSON, **kwargs) -> JSON: - """ - Returns the schema for a JSON object with the given properties. - - >>> from azul.doctests import assert_json - >>> assert_json(object_type({'x': {'type': 'string'}}, required=['x'])) - { - "type": "object", - "properties": { - "x": { - "type": "string" - } - }, - "required": [ - "x" - ] - } - """ - return { - 'type': 'object', - 'properties': properties, - **kwargs - } - - def array_type(item: JSON, *items: JSON, **kwargs) -> JSON: """ Returns the schema for a JSON array of items of a given type or types. diff --git a/src/azul/service/catalog_controller.py b/src/azul/service/catalog_controller.py index 10cd437d2..43c280d34 100644 --- a/src/azul/service/catalog_controller.py +++ b/src/azul/service/catalog_controller.py @@ -27,15 +27,15 @@ class CatalogController(ServiceAppController): def list_catalogs(self) -> schema.object( default_catalog=str, catalogs=schema.object( - additional_properties=schema.object( + additionalProperties=schema.object( atlas=str, internal=bool, plugins=schema.object( - additional_properties=schema.object( + additionalProperties=schema.object( name=str, sources=schema.optional(schema.array(str)), indices=schema.optional(schema.object( - additional_properties=schema.object( + additionalProperties=schema.object( default_sort=str, default_order=str ) From 0b70af5fe41815941653ffc904aebfaacf650311 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sat, 18 Jan 2025 18:19:40 -0800 Subject: [PATCH 14/24] Replace Union and Optional --- src/azul/__init__.py | 60 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/src/azul/__init__.py b/src/azul/__init__.py index 970ca46be..61367f64c 100644 --- a/src/azul/__init__.py +++ b/src/azul/__init__.py @@ -24,13 +24,11 @@ BinaryIO, ClassVar, NotRequired, - Optional, Self, TYPE_CHECKING, TextIO, TypeVar, TypedDict, - Union, ) import attr @@ -141,7 +139,7 @@ def _validate_debug(self, debug): _es_endpoint_env_name = 'AZUL_ES_ENDPOINT' @property - def es_endpoint(self) -> Optional[Netloc]: + def es_endpoint(self) -> Netloc | None: try: es_endpoint = self.environ[self._es_endpoint_env_name] except KeyError: @@ -152,8 +150,8 @@ def es_endpoint(self) -> Optional[Netloc]: def es_endpoint_env(self, *, - es_endpoint: Union[Netloc, str], - es_instance_count: Union[int, str] + es_endpoint: Netloc | str, + es_instance_count: int | str ) -> Mapping[str, str]: if isinstance(es_endpoint, tuple): host, port = es_endpoint @@ -217,7 +215,7 @@ def qualified_bucket_name(self, def alb_access_log_path_prefix(self, *component: str, - deployment: Optional[str] = current, + deployment: str | None = current, ) -> str: """ :param deployment: Which deployment name to use in the path. Omit this @@ -230,7 +228,7 @@ def alb_access_log_path_prefix(self, def s3_access_log_path_prefix(self, *component: str, - deployment: Optional[str] = current, + deployment: str | None = current, ) -> str: """ :param deployment: Which deployment name to use in the path. Omit this @@ -243,7 +241,7 @@ def s3_access_log_path_prefix(self, def _log_path_prefix(self, prefix: list[str], - deployment: Optional[str], + deployment: str | None, *component: str, ): if deployment is self.current: @@ -291,7 +289,7 @@ def data_browser_domain(self): return domain @property - def dss_endpoint(self) -> Optional[str]: + def dss_endpoint(self) -> str | None: if self.dss_source is None: return None else: @@ -301,7 +299,7 @@ def dss_endpoint(self) -> Optional[str]: return SimpleSourceSpec.parse(self.dss_source).name @property - def dss_source(self) -> Optional[str]: + def dss_source(self) -> str | None: return self.environ.get('AZUL_DSS_SOURCE') def sources(self, catalog: CatalogName) -> Set[str]: @@ -331,7 +329,7 @@ def sam_service_url(self) -> mutable_furl: return furl(self.environ['AZUL_SAM_SERVICE_URL']) @property - def duos_service_url(self) -> Optional[mutable_furl]: + def duos_service_url(self) -> mutable_furl | None: url = self.environ.get('AZUL_DUOS_SERVICE_URL') return None if url is None else furl(url) @@ -369,8 +367,8 @@ def dss_direct_access(self) -> bool: def dss_direct_access_role(self, lambda_name: str, - stage: Optional[str] = None - ) -> Optional[str]: + stage: str | None = None + ) -> str | None: key = 'AZUL_DSS_DIRECT_ACCESS_ROLE' try: role_arn = self.environ[key] @@ -677,13 +675,13 @@ def indexer_name(self) -> str: def service_name(self) -> str: return self.service_function_name() - def indexer_function_name(self, handler_name: Optional[str] = None): + def indexer_function_name(self, handler_name: str | None = None): return self._function_name('indexer', handler_name) - def service_function_name(self, handler_name: Optional[str] = None): + def service_function_name(self, handler_name: str | None = None): return self._function_name('service', handler_name) - def _function_name(self, lambda_name: str, handler_name: Optional[str]): + def _function_name(self, lambda_name: str, handler_name: str | None): if handler_name is None: return self.qualified_resource_name(lambda_name) else: @@ -925,29 +923,29 @@ def default_catalog(self) -> CatalogName: return first(self.catalogs) @property - def current_catalog(self) -> Optional[str]: + def current_catalog(self) -> str | None: return self.environ.get('azul_current_catalog') - def it_catalog_for(self, catalog: CatalogName) -> Optional[CatalogName]: + def it_catalog_for(self, catalog: CatalogName) -> CatalogName | None: it_catalog = self.catalogs[catalog].it_catalog assert it_catalog in self.integration_test_catalogs, it_catalog return it_catalog - def is_dss_enabled(self, catalog: Optional[str] = None) -> bool: + def is_dss_enabled(self, catalog: str | None = None) -> bool: return self._is_plugin_enabled('dss', catalog) - def is_tdr_enabled(self, catalog: Optional[str] = None) -> bool: + def is_tdr_enabled(self, catalog: str | None = None) -> bool: return self._is_plugin_enabled('tdr', catalog) - def is_hca_enabled(self, catalog: Optional[str] = None) -> bool: + def is_hca_enabled(self, catalog: str | None = None) -> bool: return self._is_plugin_enabled('hca', catalog) - def is_anvil_enabled(self, catalog: Optional[str] = None) -> bool: + def is_anvil_enabled(self, catalog: str | None = None) -> bool: return self._is_plugin_enabled('anvil', catalog) def _is_plugin_enabled(self, plugin_prefix: str, - catalog: Optional[str] + catalog: str | None ) -> bool: def predicate(catalog): return any( @@ -1078,7 +1076,7 @@ def deployment(self) -> Deployment: return self.Deployment(self.deployment_stage) @property - def _shared_deployments(self) -> Mapping[Optional[str], Sequence[Deployment]]: + def _shared_deployments(self) -> Mapping[str | None, Sequence[Deployment]]: """ Maps a branch name to a sequence of names of shared deployments the branch can be deployed to. The key of None signifies any other branch @@ -1299,7 +1297,7 @@ def secrets_manager_secret_name(self, *args): def enable_gcp(self): return self.google_project() is not None - def google_project(self) -> Optional[str]: + def google_project(self) -> str | None: return self.environ.get('GOOGLE_PROJECT') class ServiceAccount(Enum): @@ -1459,7 +1457,7 @@ def github_access_token(self) -> str: return self.environ['azul_github_access_token'] @property - def gitlab_access_token(self) -> Optional[str]: + def gitlab_access_token(self) -> str | None: return self.environ.get('azul_gitlab_access_token') @property @@ -1488,7 +1486,7 @@ def current_sources(self) -> list[str]: minimum_compression_size = 0 @property - def google_oauth2_client_id(self) -> Optional[str]: + def google_oauth2_client_id(self) -> str | None: return self.environ.get('AZUL_GOOGLE_OAUTH2_CLIENT_ID') @property @@ -1522,7 +1520,7 @@ class SlackIntegration: channel_id: str @property - def slack_integration(self) -> Optional[SlackIntegration]: + def slack_integration(self) -> SlackIntegration | None: # FIXME: Eliminate local import # https://github.com/DataBiosphere/azul/issues/3133 @@ -1683,8 +1681,8 @@ def reject(condition: bool, *args, exception: type = RequirementError): def open_resource(*path: str, - package_root: Optional[str] = None, - binary=False) -> Union[TextIO, BinaryIO]: + package_root: str | None = None, + binary=False) -> TextIO | BinaryIO: """ Return a file object for the resources at the given path. A resource is a source file that can be loaded at runtime. Resources typically aren't @@ -1744,7 +1742,7 @@ def str_to_bool(string: str): E = TypeVar('E') -def iif(condition: bool, then: T, otherwise: E = absent) -> Union[T, E]: +def iif(condition: bool, then: T, otherwise: E = absent) -> T | E: """ An alternative to ``if`` expressions, that, in certain situations, might be more convenient or readable, such as when the ``else`` branch From 80456ccc44a11f96511c44b7c3ce2a99ef897839 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sat, 18 Jan 2025 22:57:08 -0800 Subject: [PATCH 15/24] Make some assertions requirements --- src/azul/chalice.py | 14 ++++++++------ test/test_openapi.py | 27 +++++++++++++++++++-------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/azul/chalice.py b/src/azul/chalice.py index 433fc5ff7..34509cc14 100644 --- a/src/azul/chalice.py +++ b/src/azul/chalice.py @@ -50,6 +50,7 @@ config, mutable_furl, open_resource, + reject, require, ) from azul.auth import ( @@ -136,11 +137,11 @@ def __init__(self, unit_test: bool = False, spec: JSON): self._patch_event_source_handler() - assert app_module_path.endswith('/app.py'), app_module_path + require(app_module_path.endswith('/app.py'), app_module_path) self.app_module_path = app_module_path self.unit_test = unit_test self.non_interactive_routes: set[tuple[str, str]] = set() - assert 'paths' not in spec, 'The top-level spec must not define paths' + reject('paths' in spec, 'The top-level spec must not define paths') self._specs = copy_json(spec) self._specs['paths'] = {} # The `debug` arg controls whether tracebacks appear in error responses @@ -331,7 +332,7 @@ def spec(self) -> JSON: for method in path.values() if isinstance(method, dict) for tag in method.get('tags', []) ) - assert 'servers' not in self._specs + reject('servers' in self._specs, "The 'servers' entry is computed") return { **self._specs, 'tags': [ @@ -394,7 +395,8 @@ def _register_spec(self, Add a route's specifications to the specification object. """ if path_spec is not None: - assert path not in self._specs['paths'], 'Only specify path_spec once per route path' + reject(path in self._specs['paths'], + 'Only specify path_spec once per route path') self._specs['paths'][path] = copy_json(path_spec) for method in methods: @@ -403,8 +405,8 @@ def _register_spec(self, # This may override duplicate specs from path_specs if path not in self._specs['paths']: self._specs['paths'][path] = {} - assert method not in self._specs['paths'][path], \ - 'Only specify method_spec once per route path and method' + reject(method in self._specs['paths'][path], + 'Only specify method_spec once per route path and method') self._specs['paths'][path][method] = copy_json(method_spec) class _LogJSONEncoder(JSONEncoder): diff --git a/test/test_openapi.py b/test/test_openapi.py index 986033e5c..8ef13740f 100644 --- a/test/test_openapi.py +++ b/test/test_openapi.py @@ -8,6 +8,7 @@ from azul import ( JSON, + RequirementError, ) from azul.chalice import ( AzulChaliceApp, @@ -48,7 +49,7 @@ def test_top_level_spec(self): 'Changing input object should not affect specs') def test_already_annotated_top_level_spec(self): - with self.assertRaises(AssertionError): + with self.assertRaises(RequirementError): self.app({'paths': {'/': {'already': 'annotated'}}}) def test_unannotated(self): @@ -109,17 +110,27 @@ def test_fully_annotated_override(self): 'get': {'c': 'd'} } - with self.assertRaises(AssertionError) as cm: - @app.route('/foo', methods=['GET'], path_spec=path_spec, method_spec={'e': 'f'}) + with self.assertRaises(RequirementError) as cm: + @app.route('/foo', + methods=['GET'], + path_spec=path_spec, + method_spec={'e': 'f'}) def route(): pass # no coverage - self.assertEqual(str(cm.exception), 'Only specify method_spec once per route path and method') + self.assertEqual(str(cm.exception), + 'Only specify method_spec once per route path and method') def test_multiple_routes(self): app = self.app({'foo': 'bar'}) - @app.route('/foo', methods=['GET', 'PUT'], path_spec={'a': 'b'}, method_spec={'c': 'd'}) - @app.route('/foo/too', methods=['GET'], path_spec={'e': 'f'}, method_spec={'g': 'h'}) + @app.route('/foo', + methods=['GET', 'PUT'], + path_spec={'a': 'b'}, + method_spec={'c': 'd'}) + @app.route('/foo/too', + methods=['GET'], + path_spec={'e': 'f'}, + method_spec={'g': 'h'}) def route(): pass # no coverage @@ -145,7 +156,7 @@ def route(): def test_duplicate_method_specs(self): app = self.app({'foo': 'bar'}) - with self.assertRaises(AssertionError) as cm: + with self.assertRaises(RequirementError) as cm: @app.route('/foo', methods=['GET'], method_spec={'a': 'b'}) @app.route('/foo', methods=['GET'], method_spec={'a': 'XXX'}) def route(): @@ -159,7 +170,7 @@ def test_duplicate_path_specs(self): def route1(): pass - with self.assertRaises(AssertionError) as cm: + with self.assertRaises(RequirementError) as cm: @app.route('/foo', methods=['GET'], path_spec={'a': 'b'}, method_spec={}) def route2(): pass From 759899d5102e33cb024ab36b136fab30fcd0c0e3 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sat, 18 Jan 2025 23:00:36 -0800 Subject: [PATCH 16/24] Add overloads for azul.open_resource --- src/azul/__init__.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/azul/__init__.py b/src/azul/__init__.py index 61367f64c..641db20f8 100644 --- a/src/azul/__init__.py +++ b/src/azul/__init__.py @@ -23,12 +23,14 @@ from typing import ( BinaryIO, ClassVar, + Literal, NotRequired, Self, TYPE_CHECKING, TextIO, TypeVar, TypedDict, + overload, ) import attr @@ -1680,9 +1682,24 @@ def reject(condition: bool, *args, exception: type = RequirementError): raise exception(*args) +@overload def open_resource(*path: str, package_root: str | None = None, - binary=False) -> TextIO | BinaryIO: + binary: Literal[False] = False + ) -> TextIO: ... + + +@overload +def open_resource(*path: str, + package_root: str | None = None, + binary: Literal[True] = False + ) -> BinaryIO: ... + + +def open_resource(*path: str, + package_root: str | None = None, + binary: bool = False + ) -> TextIO | BinaryIO: """ Return a file object for the resources at the given path. A resource is a source file that can be loaded at runtime. Resources typically aren't From 21c2d5d8ff0181c4d5966e9b4ec0ab2f8b5f6a73 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sat, 18 Jan 2025 23:02:44 -0800 Subject: [PATCH 17/24] Fix bug in MutableCompositeJSON --- src/azul/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azul/types.py b/src/azul/types.py index 94825cfcd..6c6e198ea 100644 --- a/src/azul/types.py +++ b/src/azul/types.py @@ -38,7 +38,7 @@ type AnyMutableJSON = list[AnyMutableJSON] | dict[str, AnyMutableJSON] | PrimitiveJSON type MutableJSON = dict[str, AnyMutableJSON] type MutableJSONs = list[MutableJSON] -type MutableCompositeJSON = MutableJSON | list[AnyJSON] +type MutableCompositeJSON = MutableJSON | list[AnyMutableJSON] type MutableFlatJSON = dict[str, PrimitiveJSON] From 23cd3c706947b6fe2735723312e6ad3ee60c995a Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sat, 18 Jan 2025 23:12:09 -0800 Subject: [PATCH 18/24] Rearrange JSON types; extract type alias for JSON arrays --- src/azul/attrs.py | 4 ++-- src/azul/types.py | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/azul/attrs.py b/src/azul/attrs.py index 849312bfa..06589673d 100644 --- a/src/azul/attrs.py +++ b/src/azul/attrs.py @@ -52,8 +52,8 @@ def as_annotated(): ... # doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... - TypeError: ('y', set(), (, - , , , + TypeError: ('y', set(), (, + , , , , , )) Note that you cannot share one return value of this function between more diff --git a/src/azul/types.py b/src/azul/types.py index 6c6e198ea..75bc26ff8 100644 --- a/src/azul/types.py +++ b/src/azul/types.py @@ -27,18 +27,20 @@ # two generic types are the most specific *immutable* super-types of `list`, # `tuple` and `dict`: -type AnyJSON = Sequence[AnyJSON] | Mapping[str, AnyJSON] | PrimitiveJSON +type AnyJSON = JSON | JSONArray | PrimitiveJSON type JSON = Mapping[str, AnyJSON] +type JSONArray = Sequence[AnyJSON] type JSONs = Sequence[JSON] -type CompositeJSON = JSON | Sequence[AnyJSON] +type CompositeJSON = JSON | JSONArray type FlatJSON = Mapping[str, PrimitiveJSON] # For mutable JSON we can be more specific and use dict and list: -type AnyMutableJSON = list[AnyMutableJSON] | dict[str, AnyMutableJSON] | PrimitiveJSON +type AnyMutableJSON = MutableJSON | MutableJSONArray | PrimitiveJSON type MutableJSON = dict[str, AnyMutableJSON] +type MutableJSONArray = list[AnyMutableJSON] type MutableJSONs = list[MutableJSON] -type MutableCompositeJSON = MutableJSON | list[AnyMutableJSON] +type MutableCompositeJSON = MutableJSON | MutableJSONArray type MutableFlatJSON = dict[str, PrimitiveJSON] From 441b56533d40aab639fcd968ddf311b212a76e09 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 11:30:43 -0800 Subject: [PATCH 19/24] Cosmetics --- test/test_openapi.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/test_openapi.py b/test/test_openapi.py index 8ef13740f..7a36ecaac 100644 --- a/test/test_openapi.py +++ b/test/test_openapi.py @@ -117,8 +117,8 @@ def test_fully_annotated_override(self): method_spec={'e': 'f'}) def route(): pass # no coverage - self.assertEqual(str(cm.exception), - 'Only specify method_spec once per route path and method') + self.assertEqual('Only specify method_spec once per route path and method', + str(cm.exception)) def test_multiple_routes(self): app = self.app({'foo': 'bar'}) @@ -161,7 +161,8 @@ def test_duplicate_method_specs(self): @app.route('/foo', methods=['GET'], method_spec={'a': 'XXX'}) def route(): pass - self.assertEqual(str(cm.exception), 'Only specify method_spec once per route path and method') + self.assertEqual('Only specify method_spec once per route path and method', + str(cm.exception)) def test_duplicate_path_specs(self): app = self.app({'foo': 'bar'}) @@ -174,7 +175,8 @@ def route1(): @app.route('/foo', methods=['GET'], path_spec={'a': 'b'}, method_spec={}) def route2(): pass - self.assertEqual(str(cm.exception), 'Only specify path_spec once per route path') + self.assertEqual('Only specify path_spec once per route path', + str(cm.exception)) def test_shared_path_spec(self): """ From 355ac7778eeab68d86402b59d247fffa043e1883 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 11:50:12 -0800 Subject: [PATCH 20/24] Rename method_spec to spec --- lambdas/indexer/app.py | 2 +- lambdas/layer/app.py | 2 +- lambdas/service/app.py | 32 +++++++++++++-------------- src/azul/chalice.py | 39 +++++++++++++++++--------------- src/azul/health.py | 10 ++++----- test/test_app_logging.py | 2 +- test/test_openapi.py | 48 ++++++++++++++++++++-------------------- 7 files changed, 69 insertions(+), 66 deletions(-) diff --git a/lambdas/indexer/app.py b/lambdas/indexer/app.py index 2d33bb59a..612a28fd0 100644 --- a/lambdas/indexer/app.py +++ b/lambdas/indexer/app.py @@ -111,7 +111,7 @@ def _authenticate(self) -> Optional[HMACAuthentication]: @app.route( '/{catalog}/{action}', methods=['POST'], - method_spec={ + spec={ 'tags': ['Indexing'], 'summary': 'Notify the indexer to perform an action on a bundle', 'description': fd(''' diff --git a/lambdas/layer/app.py b/lambdas/layer/app.py index f0370973c..7feec2118 100644 --- a/lambdas/layer/app.py +++ b/lambdas/layer/app.py @@ -14,6 +14,6 @@ spec={}) -@app.route('/', method_spec={}) +@app.route('/', spec={}) def foo(): pass diff --git a/lambdas/service/app.py b/lambdas/service/app.py index 665159e0b..19263415c 100644 --- a/lambdas/service/app.py +++ b/lambdas/service/app.py @@ -474,7 +474,7 @@ def manifest_url(self, enabled=config.google_oauth2_client_id is not None, cache_control='no-store', interactive=False, - method_spec={ + spec={ 'summary': 'Destination endpoint for Google OAuth 2.0 redirects', 'tags': ['Auxiliary'], 'responses': { @@ -747,7 +747,7 @@ def fmt_error(err_description, params): raise BRE(f'Invalid value for `{param_name}`') -deprecated_method_spec = { +deprecated_spec = { 'summary': 'This endpoint will be removed in the future.', 'tags': ['Deprecated'], 'deprecated': True @@ -758,7 +758,7 @@ def fmt_error(err_description, params): '/index/catalogs', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'List all available catalogs.', 'tags': ['Index'], 'responses': { @@ -1074,7 +1074,7 @@ def repository_head_search_spec(): @app.route( '/index/{entity_type}', methods=['GET'], - method_spec=repository_search_spec(post=False), + spec=repository_search_spec(post=False), cors=True ) # FIXME: Properly document the POST version of /index @@ -1083,19 +1083,19 @@ def repository_head_search_spec(): '/index/{entity_type}', methods=['POST'], content_types=['application/json'], - method_spec=repository_search_spec(post=True), + spec=repository_search_spec(post=True), cors=True ) @app.route( '/index/{entity_type}', methods=['HEAD'], - method_spec=repository_head_search_spec(), + spec=repository_head_search_spec(), cors=True ) @app.route( '/index/{entity_type}/{entity_id}', methods=['GET'], - method_spec=repository_id_spec(), + spec=repository_id_spec(), cors=True ) def repository_search(entity_type: str, entity_id: Optional[str] = None) -> JSON: @@ -1128,7 +1128,7 @@ def _hoist_parameters(query_params, request): '/index/summary', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Statistics on the data present across all entities.', 'responses': { '200': { @@ -1173,7 +1173,7 @@ def _hoist_parameters(query_params, request): @app.route( '/index/summary', methods=['HEAD'], - method_spec={ + spec={ **repository_head_spec(for_summary=True), **repository_summary_spec } @@ -1213,7 +1213,7 @@ def manifest_route(*, fetch: bool, initiate: bool): ''')) ] }, - method_spec={ + spec={ 'tags': ['Manifests'], 'summary': ( @@ -1594,7 +1594,7 @@ def generate_manifest(event: AnyJSON, _context: LambdaContext): methods=['GET'], interactive=False, cors=True, - method_spec={ + spec={ **repository_files_spec, 'summary': 'Redirect to a URL for downloading a given data file from the ' 'underlying repository', @@ -1661,7 +1661,7 @@ def repository_files(file_uuid: str) -> Response: '/fetch/repository/files/{file_uuid}', methods=['GET'], cors=True, - method_spec={ + spec={ **repository_files_spec, 'summary': 'Request a URL for downloading a given data file', 'responses': { @@ -1747,7 +1747,7 @@ def validate_version(version: str) -> None: '/repository/sources', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'List available data sources', 'tags': ['Repository'], 'parameters': [catalog_param_spec], @@ -1799,7 +1799,7 @@ def hash_url(url): methods=['GET'], enabled=config.is_dss_enabled(), cors=True, - method_spec={ + spec={ 'summary': 'Get file DRS object', 'tags': ['DRS'], 'description': fd(''' @@ -1847,7 +1847,7 @@ def get_data_object(file_uuid): methods=['GET'], enabled=config.is_dss_enabled(), cors=True, - method_spec={ + spec={ 'summary': 'Get a file with an access ID', 'description': fd(''' This endpoint returns a URL that can be used to fetch the bytes of a @@ -1898,7 +1898,7 @@ def get_data_object_access(file_uuid, access_id): methods=['GET'], enabled=config.is_dss_enabled(), cors=True, - method_spec=deprecated_method_spec + spec=deprecated_spec ) def dos_get_data_object(file_uuid): """ diff --git a/src/azul/chalice.py b/src/azul/chalice.py index 34509cc14..031ad7878 100644 --- a/src/azul/chalice.py +++ b/src/azul/chalice.py @@ -265,7 +265,7 @@ def route(self, interactive: bool = True, cache_control: str = 'no-store', path_spec: JSON | None = None, - method_spec: JSON, + spec: JSON, **kwargs): """ Decorates a view handler function in a Chalice application. @@ -287,27 +287,30 @@ def route(self, header. :param path_spec: Corresponds to an OpenAPI Paths Object. See + https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#paths-object + If multiple `@app.route` invocations refer to the same path (but with different HTTP methods), only specify this argument for one of them, otherwise an AssertionError will be raised. - :param method_spec: Corresponds to an OpenAPI Operation Object. See - https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object - This must be specified for every `@app.route` - invocation. + :param spec: Corresponds to an OpenAPI Operation Object. See + + https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object + + This must be specified for every `@app.route` invocation. """ if enabled: if not interactive: require(bool(methods), 'Must list methods with interactive=False') self.non_interactive_routes.update((path, method) for method in methods) - method_spec = deep_dict_merge(method_spec, self.default_method_specs()) + spec = deep_dict_merge(spec, self.default_specs()) chalice_decorator = super().route(path, methods=methods, **kwargs) def decorator(view_func): view_func.cache_control = cache_control - self._register_spec(path, path_spec, method_spec, methods) + self._register_spec(path, path_spec, spec, methods) return chalice_decorator(view_func) return decorator @@ -389,7 +392,7 @@ def is_running_locally(self) -> bool: def _register_spec(self, path: str, path_spec: JSON | None, - method_spec: JSON, + spec: JSON, methods: Iterable[str]): """ Add a route's specifications to the specification object. @@ -406,8 +409,8 @@ def _register_spec(self, if path not in self._specs['paths']: self._specs['paths'][path] = {} reject(method in self._specs['paths'][path], - 'Only specify method_spec once per route path and method') - self._specs['paths'][path][method] = copy_json(method_spec) + "Only specify 'spec' once per route path and method") + self._specs['paths'][path][method] = copy_json(spec) class _LogJSONEncoder(JSONEncoder): @@ -666,7 +669,7 @@ def default_routes(self): @self.route( '/', interactive=False, - method_spec={ + spec={ 'summary': 'Redirect to the Swagger UI for interactive use of this REST API', 'tags': ['Auxiliary'], 'responses': { @@ -685,7 +688,7 @@ def swagger_redirect(): interactive=False, cache_control=self._http_cache_for(24 * 60 * 60), cors=False, - method_spec={ + spec={ 'summary': 'The Swagger UI for interactive use of this REST API', 'tags': ['Auxiliary'], 'responses': { @@ -703,7 +706,7 @@ def swagger_ui(): interactive=False, cache_control=self._http_cache_for(60), cors=True, - method_spec={ + spec={ 'summary': 'Used internally by the Swagger UI', 'tags': ['Auxiliary'], 'responses': { @@ -736,7 +739,7 @@ def swagger_initializer(): interactive=False, cache_control=self._http_cache_for(24 * 60 * 60), cors=True, - method_spec={ + spec={ 'summary': 'Static files needed for the Swagger UI', 'tags': ['Auxiliary'], 'responses': { @@ -762,7 +765,7 @@ def swagger_resource(file): methods=['GET'], cache_control=self._http_cache_for(60), cors=True, - method_spec={ + spec={ 'summary': 'Return OpenAPI specifications for this REST API', 'description': format_description(''' This endpoint returns the [OpenAPI specifications]' @@ -796,7 +799,7 @@ def openapi(): '/version', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Describe current version of this REST API', 'tags': ['Auxiliary'], 'responses': { @@ -835,7 +838,7 @@ def version(): '/robots.txt', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Robots Exclusion Protocol', 'tags': ['Auxiliary'], 'responses': { @@ -862,7 +865,7 @@ def robots_txt(): return locals() - def default_method_specs(self): + def default_specs(self): return { 'responses': { '504': { diff --git a/src/azul/health.py b/src/azul/health.py index aa018f9f4..79974279e 100644 --- a/src/azul/health.py +++ b/src/azul/health.py @@ -398,7 +398,7 @@ def _health_spec(health_keys: dict) -> JSON: '/health', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Complete health check', 'description': format_description(f''' Health check of the {_app_name} REST API and all @@ -420,7 +420,7 @@ def health(): '/health/basic', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Basic health check', 'description': format_description(f''' Health check of only the REST API itself, excluding other @@ -438,7 +438,7 @@ def basic_health(): '/health/cached', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Cached health check for continuous monitoring', 'description': format_description(f''' Return a cached copy of the @@ -459,7 +459,7 @@ def cached_health(): '/health/fast', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Fast health check', 'description': format_description(''' Performance-optimized health check of the REST API and other @@ -479,7 +479,7 @@ def fast_health(): '/health/{keys}', methods=['GET'], cors=True, - method_spec={ + spec={ 'summary': 'Selective health check', 'description': format_description(''' This endpoint allows clients to request a health check on a diff --git a/test/test_app_logging.py b/test/test_app_logging.py index c5445830c..26e71682e 100644 --- a/test/test_app_logging.py +++ b/test/test_app_logging.py @@ -55,7 +55,7 @@ def test(self): app = AzulChaliceApp(__name__, '/app.py', unit_test=True, spec={}) path = '/fail/path' - @app.route(path, method_spec={}) + @app.route(path, spec={}) def fail(): raise ValueError(magic_message) diff --git a/test/test_openapi.py b/test/test_openapi.py index 7a36ecaac..6769ebb47 100644 --- a/test/test_openapi.py +++ b/test/test_openapi.py @@ -55,7 +55,7 @@ def test_already_annotated_top_level_spec(self): def test_unannotated(self): app = self.app({'foo': 'bar'}) - @app.route('/foo', methods=['GET', 'PUT'], method_spec={}) + @app.route('/foo', methods=['GET', 'PUT'], spec={}) def route(): pass # no coverage @@ -65,13 +65,13 @@ def route(): 'tags': [], 'servers': [{'url': 'https://fake.url/'}] } - actual_spec = self._assert_default_method_spec(app.spec()) + actual_spec = self._assert_default_spec(app.spec()) self.assertEqual(expected, actual_spec) - def test_just_method_spec(self): + def test_just_spec(self): app = self.app({'foo': 'bar'}) - @app.route('/foo', methods=['GET', 'PUT'], method_spec={'a': 'b'}) + @app.route('/foo', methods=['GET', 'PUT'], spec={'a': 'b'}) def route(): pass # no coverage @@ -87,16 +87,16 @@ def route(): 'servers': [{'url': 'https://fake.url/'}] } - actual_spec = self._assert_default_method_spec(app.spec()) + actual_spec = self._assert_default_spec(app.spec()) self.assertEqual(expected_spec, actual_spec) - def _assert_default_method_spec(self, actual_spec: JSON) -> JSON: + def _assert_default_spec(self, actual_spec: JSON) -> JSON: actual_spec = copy_json(actual_spec) for path_spec in actual_spec['paths'].values(): - for method, method_spec in path_spec.items(): + for method, spec in path_spec.items(): methods = {'get', 'put'} # only what's used in these tests if method in methods: - responses = method_spec.pop('responses') + responses = spec.pop('responses') response = responses.pop('504') description = response.pop('description') self.assertIn('Request timed out', description) @@ -114,11 +114,11 @@ def test_fully_annotated_override(self): @app.route('/foo', methods=['GET'], path_spec=path_spec, - method_spec={'e': 'f'}) + spec={'e': 'f'}) def route(): pass # no coverage - self.assertEqual('Only specify method_spec once per route path and method', - str(cm.exception)) + self.assertEqual(str(cm.exception), + "Only specify 'spec' once per route path and method") def test_multiple_routes(self): app = self.app({'foo': 'bar'}) @@ -126,11 +126,11 @@ def test_multiple_routes(self): @app.route('/foo', methods=['GET', 'PUT'], path_spec={'a': 'b'}, - method_spec={'c': 'd'}) + spec={'c': 'd'}) @app.route('/foo/too', methods=['GET'], path_spec={'e': 'f'}, - method_spec={'g': 'h'}) + spec={'g': 'h'}) def route(): pass # no coverage @@ -150,29 +150,29 @@ def route(): 'tags': [], 'servers': [{'url': 'https://fake.url/'}] } - actual_spec = self._assert_default_method_spec(app.spec()) + actual_spec = self._assert_default_spec(app.spec()) self.assertEqual(expected_specs, actual_spec) - def test_duplicate_method_specs(self): + def test_duplicate_specs(self): app = self.app({'foo': 'bar'}) with self.assertRaises(RequirementError) as cm: - @app.route('/foo', methods=['GET'], method_spec={'a': 'b'}) - @app.route('/foo', methods=['GET'], method_spec={'a': 'XXX'}) + @app.route('/foo', methods=['GET'], spec={'a': 'b'}) + @app.route('/foo', methods=['GET'], spec={'a': 'XXX'}) def route(): pass - self.assertEqual('Only specify method_spec once per route path and method', + self.assertEqual("Only specify 'spec' once per route path and method", str(cm.exception)) def test_duplicate_path_specs(self): app = self.app({'foo': 'bar'}) - @app.route('/foo', methods=['PUT'], path_spec={'a': 'XXX'}, method_spec={}) + @app.route('/foo', methods=['PUT'], path_spec={'a': 'XXX'}, spec={}) def route1(): pass with self.assertRaises(RequirementError) as cm: - @app.route('/foo', methods=['GET'], path_spec={'a': 'b'}, method_spec={}) + @app.route('/foo', methods=['GET'], path_spec={'a': 'b'}, spec={}) def route2(): pass self.assertEqual('Only specify path_spec once per route path', @@ -194,19 +194,19 @@ def test_shared_path_spec(self): methods=['GET'], cors=True, path_spec=shared_path_spec, - method_spec={'summary': f'Swagger test {i}'}) + spec={'summary': f'Swagger test {i}'}) def swagger_test(): pass - method_specs = app.spec()['paths'].values() - self.assertNotEqual(*method_specs) + specs = app.spec()['paths'].values() + self.assertNotEqual(*specs) def test_unused_tags(self): app = self.app({ 'tags': [{'name': name} for name in ('foo', 'bar', 'baz', 'qux')] }) - @app.route('/foo', methods=['PUT'], method_spec={'tags': ['foo', 'qux']}) + @app.route('/foo', methods=['PUT'], spec={'tags': ['foo', 'qux']}) def route1(): pass From 6cbbfd501ef68569acf42c10a164d9085b69bef9 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 11:46:13 -0800 Subject: [PATCH 21/24] Reorder method args --- src/azul/chalice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/azul/chalice.py b/src/azul/chalice.py index 031ad7878..3768feb76 100644 --- a/src/azul/chalice.py +++ b/src/azul/chalice.py @@ -310,7 +310,7 @@ def route(self, def decorator(view_func): view_func.cache_control = cache_control - self._register_spec(path, path_spec, spec, methods) + self._register_spec(path, methods, path_spec, spec) return chalice_decorator(view_func) return decorator @@ -391,9 +391,9 @@ def is_running_locally(self) -> bool: def _register_spec(self, path: str, + methods: Iterable[str], path_spec: JSON | None, - spec: JSON, - methods: Iterable[str]): + spec: JSON): """ Add a route's specifications to the specification object. """ From 8c526f9e8904a761dfda9734a293f14cebe46f29 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 15:39:48 -0800 Subject: [PATCH 22/24] [R] Fix: AttributeError for Chalice.lambda_context and .current_request (#4558) --- requirements.all.txt | 6 +++--- requirements.dev.trans.txt | 4 ++-- requirements.dev.txt | 2 +- src/azul/chalice.py | 10 ++-------- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/requirements.all.txt b/requirements.all.txt index 865b61776..7ca0f35ce 100644 --- a/requirements.all.txt +++ b/requirements.all.txt @@ -10,12 +10,12 @@ blinker==1.9.0 boto3==1.35.84 boto3-stubs==1.35.84 botocore==1.35.84 -botocore-stubs==1.36.0 +botocore-stubs==1.36.2 brotli==1.1.0 cachetools==5.5.0 certifi==2024.12.14 cffi==1.17.1 -chalice==1.31.3+15 +chalice==1.31.3+16 charset-normalizer==3.4.1 chevron==0.14.0 click==8.1.8 @@ -129,7 +129,7 @@ smmap==5.0.2 strict-rfc3339==0.7 tqdm==4.67.1 types-awscrt==0.23.6 -types-s3transfer==0.11.0 +types-s3transfer==0.11.1 types-urllib3==1.26.20 typing_extensions==4.12.2 tzlocal==5.2 diff --git a/requirements.dev.trans.txt b/requirements.dev.trans.txt index 2fecc932c..0f3e93a27 100644 --- a/requirements.dev.trans.txt +++ b/requirements.dev.trans.txt @@ -1,6 +1,6 @@ blessed==1.20.0 blinker==1.9.0 -botocore-stubs==1.36.0 +botocore-stubs==1.36.2 brotli==1.1.0 click==8.1.8 colorama==0.4.6 @@ -52,7 +52,7 @@ runs==1.2.2 smmap==5.0.2 tqdm==4.67.1 types-awscrt==0.23.6 -types-s3transfer==0.11.0 +types-s3transfer==0.11.1 uritemplate==4.1.1 wcwidth==0.2.13 www-authenticate==0.9.2 diff --git a/requirements.dev.txt b/requirements.dev.txt index 21e79ec70..2a982cab7 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -5,7 +5,7 @@ coverage==7.6.9 docker==7.1.0 flake8==7.1.1 gevent==24.11.1 -git+https://github.com/DataBiosphere/azul-chalice@1.31.3+15#egg=chalice +git+https://github.com/DataBiosphere/azul-chalice@1.31.3+16#egg=chalice git+https://github.com/hannes-ucsc/requirements-parser@v0.2.0+1#egg=requirements-parser gitpython==3.1.43 google-api-python-client==2.156.0 diff --git a/src/azul/chalice.py b/src/azul/chalice.py index 3768feb76..2ba2361cd 100644 --- a/src/azul/chalice.py +++ b/src/azul/chalice.py @@ -125,10 +125,8 @@ def aws_name(self) -> str: class AzulChaliceApp(Chalice): - # FIXME: Remove these two class attributes once upstream issue is fixed - # https://github.com/DataBiosphere/azul/issues/4558 - lambda_context = None - current_request = None + lambda_context: LambdaContext | None + current_request: AzulRequest | None def __init__(self, app_name: str, @@ -513,10 +511,6 @@ def load_resource(self, *path: str) -> str: with open_resource(*path, package_root=package_root) as f: return f.read() - # Some type annotations to help with auto-complete - lambda_context: LambdaContext - current_request: AzulRequest - @property def catalog(self) -> str: request = self.current_request From 9d8c4bb63c56b6bbe69d0c701e15e54908bdb370 Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 15:35:11 -0800 Subject: [PATCH 23/24] Simplify indexer action enum --- src/azul/indexer/index_controller.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/azul/indexer/index_controller.py b/src/azul/indexer/index_controller.py index 0c9da8bcf..6b16116c8 100644 --- a/src/azul/indexer/index_controller.py +++ b/src/azul/indexer/index_controller.py @@ -16,6 +16,7 @@ import logging import time from typing import ( + Self, cast, ) import uuid @@ -76,7 +77,7 @@ class Action(Enum): delete = auto() @classmethod - def from_json(cls, action: str): + def from_json(cls, action: str) -> Self: try: return Action[action] except KeyError: @@ -85,14 +86,6 @@ def from_json(cls, action: str): def to_json(self) -> str: return self.name - def is_delete(self) -> bool: - if self is self.delete: - return True - elif self is self.add: - return False - else: - assert False - class IndexController(AppController): # The number of documents to be queued in a single SQS `send_messages`. @@ -176,7 +169,7 @@ def contribute(self, event: Iterable[SQSRecord], *, retry=False): notification = message['notification'] catalog = message['catalog'] assert catalog is not None - delete = action.is_delete() + delete = action is Action.delete contributions, replicas = self.transform(catalog, notification, delete) log.info('Writing %i contributions to index.', len(contributions)) From 4c6e0882f34f820d775cceff3a87f8872224ec3b Mon Sep 17 00:00:00 2001 From: Hannes Schmidt Date: Sun, 19 Jan 2025 15:39:48 -0800 Subject: [PATCH 24/24] [R p] Cover `azul.chalice` with mypy (#6821) --- .mypy.ini | 5 ++- requirements.all.txt | 1 + requirements.dev.txt | 1 + requirements.txt | 2 +- src/azul/chalice.py | 69 +++++++++++++++++++++++-------------- src/azul/types.py | 81 ++++++++++++++++++++++++++++++-------------- 6 files changed, 105 insertions(+), 54 deletions(-) diff --git a/.mypy.ini b/.mypy.ini index bccbb3149..9fa196d4e 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -8,7 +8,10 @@ modules = azul.args, azul.attrs, azul.auth, - azul.azulclient + azul.azulclient, + azul.bytes, + azul.caching, + azul.chalice packages = azul.openapi diff --git a/requirements.all.txt b/requirements.all.txt index 7ca0f35ce..076124408 100644 --- a/requirements.all.txt +++ b/requirements.all.txt @@ -129,6 +129,7 @@ smmap==5.0.2 strict-rfc3339==0.7 tqdm==4.67.1 types-awscrt==0.23.6 +types-chevron==0.14.0 types-s3transfer==0.11.1 types-urllib3==1.26.20 typing_extensions==4.12.2 diff --git a/requirements.dev.txt b/requirements.dev.txt index 2a982cab7..9e762682c 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -24,6 +24,7 @@ python-gitlab==5.2.0 pyyaml==6.0.2 responses==0.25.3 strict-rfc3339==0.7 +types-chevron==0.14.0 # match with chevron in requirements.txt types-urllib3==1.26.20 # match with urllib in requirements.txt watchdog==6.0.0 -r requirements.dev.trans.txt diff --git a/requirements.txt b/requirements.txt index 3ee15a4c9..1f9bc590e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ aws-requests-auth==0.4.3 bdbag==1.7.3 boto3==1.35.84 # Match version of the `boto3-stubs` dev dependency botocore==1.35.84 -chevron==0.14.0 +chevron==0.14.0 # Match with types-chevron in requirements.dev.txt deprecated==1.2.15 elasticsearch==7.17.12 # 7.x to match server-side elasticsearch-dsl==7.4.1 # 7.x to match server-side diff --git a/src/azul/chalice.py b/src/azul/chalice.py index 2ba2361cd..781686d0a 100644 --- a/src/azul/chalice.py +++ b/src/azul/chalice.py @@ -17,6 +17,7 @@ import pathlib from typing import ( Any, + Callable, Iterator, Literal, Self, @@ -81,6 +82,9 @@ from azul.types import ( JSON, LambdaContext, + json_dict, + json_list, + json_str, ) log = logging.getLogger(__name__) @@ -254,17 +258,17 @@ def _http_cache_for(self, seconds: int): HttpMethod = Literal['GET', 'POST', 'PUT', 'PATCH', 'HEAD', 'OPTIONS', 'DELETE'] - # noinspection PyMethodOverriding - def route(self, - path: str, - *, - methods: Sequence[HttpMethod] = ('GET',), - enabled: bool = True, - interactive: bool = True, - cache_control: str = 'no-store', - path_spec: JSON | None = None, - spec: JSON, - **kwargs): + def route[C: Callable](self, + path: str, + *, + methods: Sequence[HttpMethod] = ('GET',), + enabled: bool = True, + interactive: bool = True, + cache_control: str = 'no-store', + path_spec: JSON | None = None, + spec: JSON | None = None, + **kwargs + ) -> Callable[[C], C]: """ Decorates a view handler function in a Chalice application. @@ -297,8 +301,14 @@ def route(self, https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object - This must be specified for every `@app.route` invocation. + Even though this keyword argument has a default value, it + must be specified for every `@app.route` invocation. The + reason for the default is so that the signature of the + override is compatible with that of the overridden method, + a mypy requirement. """ + require(spec is not None, "Argument 'spec' is required") + assert spec is not None if enabled: if not interactive: require(bool(methods), 'Must list methods with interactive=False') @@ -328,17 +338,17 @@ def spec(self) -> JSON: Only call this method after all routes are registered. """ used_tags = set( - tag - for path in self._specs['paths'].values() - for method in path.values() if isinstance(method, dict) - for tag in method.get('tags', []) + json_str(tag) + for path in json_dict(self._specs['paths']).values() + for method in json_dict(path).values() if isinstance(method, dict) + for tag in json_list(method.get('tags', [])) ) reject('servers' in self._specs, "The 'servers' entry is computed") return { **self._specs, 'tags': [ - tag for tag in self._specs.get('tags', []) - if tag['name'] in used_tags + tag for tag in json_list(self._specs.get('tags', [])) + if json_dict(tag)['name'] in used_tags ], 'servers': [{'url': str(self.base_url.add(path='/'))}] } @@ -349,7 +359,9 @@ def self_url(self) -> mutable_furl: The URL of the current request, including the path, but without query arguments. Callers can safely modify the returned `furl` instance. """ - path = self.current_request.context['path'] + request = self.current_request + assert request is not None + path = request.context['path'] return self.base_url.add(path=path) @property @@ -372,7 +384,9 @@ def base_url(self) -> mutable_furl: from chalice.constants import ( DEFAULT_HANDLER_NAME, ) - assert self.lambda_context.function_name == DEFAULT_HANDLER_NAME + lambda_context = self.lambda_context + assert lambda_context is not None + assert lambda_context.function_name == DEFAULT_HANDLER_NAME scheme = 'http' else: # Invocation via API Gateway @@ -395,20 +409,20 @@ def _register_spec(self, """ Add a route's specifications to the specification object. """ + paths = json_dict(self._specs['paths']) if path_spec is not None: - reject(path in self._specs['paths'], + reject(path in paths, 'Only specify path_spec once per route path') - self._specs['paths'][path] = copy_json(path_spec) + paths[path] = copy_json(path_spec) for method in methods: # OpenAPI requires HTTP method names be lower case method = method.lower() # This may override duplicate specs from path_specs - if path not in self._specs['paths']: - self._specs['paths'][path] = {} - reject(method in self._specs['paths'][path], + path_methods = json_dict(paths.setdefault(path, {})) + reject(method in path_methods, "Only specify 'spec' once per route path and method") - self._specs['paths'][path][method] = copy_json(spec) + path_methods[method] = copy_json(spec) class _LogJSONEncoder(JSONEncoder): @@ -565,6 +579,7 @@ def bind(self, app: Chalice, handler_name: str | None = None) -> Self: @property def tf_function_resource_name(self) -> str: + assert self.handler_name is not None, 'Unbound decorator' if self.handler_name is None: return self.app_name else: @@ -879,8 +894,10 @@ class AppController: @property def lambda_context(self) -> LambdaContext: + assert self.app.lambda_context is not None return self.app.lambda_context @property def current_request(self) -> AzulRequest: + assert self.app.current_request is not None return self.app.current_request diff --git a/src/azul/types.py b/src/azul/types.py index 75bc26ff8..99a9cd0e1 100644 --- a/src/azul/types.py +++ b/src/azul/types.py @@ -44,44 +44,73 @@ type MutableFlatJSON = dict[str, PrimitiveJSON] -class LambdaContext(object): +def json_mapping(v: AnyJSON) -> JSON: + assert isinstance(v, Mapping) + return v + + +def json_sequence(v: AnyJSON) -> JSONArray: + assert isinstance(v, Sequence) + return v + + +def json_dict(v: AnyMutableJSON) -> MutableJSON: + assert isinstance(v, dict) + return v + + +def json_list(v: AnyMutableJSON) -> MutableJSONArray: + assert isinstance(v, list) + return v + + +def json_str(v: AnyMutableJSON | AnyJSON) -> str: + assert isinstance(v, str) + return v + + +def json_int(v: AnyMutableJSON | AnyJSON) -> int: + assert isinstance(v, int) + return v + + +def json_float(v: AnyMutableJSON | AnyJSON) -> float: + assert isinstance(v, float) + return v + + +def json_bool(v: AnyMutableJSON | AnyJSON) -> bool: + assert isinstance(v, bool) + return v + + +def json_none(v: AnyMutableJSON | AnyJSON) -> None: + assert v is None + return v + + +class LambdaContext: """ A stub for the AWS Lambda context """ - @property - def aws_request_id(self) -> str: - raise NotImplementedError + aws_request_id: str - @property - def log_group_name(self) -> str: - raise NotImplementedError + log_group_name: str - @property - def log_stream_name(self) -> str: - raise NotImplementedError + log_stream_name: str - @property - def function_name(self) -> str: - raise NotImplementedError + function_name: str - @property - def memory_limit_in_mb(self) -> str: - raise NotImplementedError + memory_limit_in_mb: str - @property - def function_version(self) -> str: - raise NotImplementedError + function_version: str - @property - def invoked_function_arn(self) -> str: - raise NotImplementedError + invoked_function_arn: str - def get_remaining_time_in_millis(self) -> int: - raise NotImplementedError + def get_remaining_time_in_millis(self) -> int: ... # type: ignore[empty-body] - def log(self, msg: str) -> None: - raise NotImplementedError + def log(self, msg: str) -> None: ... def is_optional(t) -> bool: