From f10430c33334800053567bf6157a97321f2a8282 Mon Sep 17 00:00:00 2001 From: cherry530 <707078654@qq.com> Date: Sat, 6 May 2023 11:24:59 +0800 Subject: [PATCH] Upgrade to 0.9.0 Signed-off-by: cherry530 <707078654@qq.com> --- parameterized-0.8.1.tar.gz | Bin 23936 -> 0 bytes parameterized-0.9.0.tar.gz | Bin 0 -> 24351 bytes parameterized-pr116-pytest4.patch | 537 ------------------------------ python-parameterized.spec | 24 +- remove_nose.patch | 123 ------- 5 files changed, 13 insertions(+), 671 deletions(-) delete mode 100644 parameterized-0.8.1.tar.gz create mode 100644 parameterized-0.9.0.tar.gz delete mode 100644 parameterized-pr116-pytest4.patch delete mode 100644 remove_nose.patch diff --git a/parameterized-0.8.1.tar.gz b/parameterized-0.8.1.tar.gz deleted file mode 100644 index 05f6972df6a39d909fbaf995d3f66cc198b6987a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23936 zcmaHRb8sd=uxG4|?PO!y*x1I#`eNI*ZQHhOb7MOj+sSu(@7;TKS9Nz&zp9z8>F(+I zYo@z@L{Ts>l4$SxU_fIFCuc@`fFr=h#M#8r!qdc;0SWnv*}1W(Lh{o z<}C)pZX>H`fXbQpJD!TYD{{H8!nRDKBy$IqGXn(G*cCK`D+5IHOsy^_qpjsDVm-`f zEsPm&GY2PYJ0~ZMUts<{U(VY0%^|h_e z&H#PQh)()iGJp!-9=OwA2?8%}-}qz}*b+Vq4x24zf@nT~1#vknVv>p+hEf#)&F7IH zP08udfBB*rhF!S&(0!ZH8B-soxC&1Vqsi+Ik94o%?%38c-mvB;kG+4%d~|hTDH<`` zhut}=&yLh?2NXdHO1~c@_+i8j<1vutT|=k{WIv9;?D|k&bSW{_@xz7*B@6S$B@w@# zKPp`*#Um!!bCfk~RXhm$BHr9Cq*V(g$U$i!Il-Tz#HvqI;Pv|X>8ap zRmZ}G@O}R_Mm*H)Y8tOoBb*uSC7&7L94gD#%GGg-P z4L}0M&!#2q)pyq+!A82fi-fIORXnRfRk_F(d9mSETE| zJE`-T7{S`K+wDWQ31%d7PJ^@ulJ%C%8nr*&I!js%sO|C<-GQol~B0pGZg zM&gfjy{=HdWcy%t<_@UBPaYA}beSw4o$}>$c=^Oa&Jl`ysaar#4lvlh(TTgEoDbY2 z&=9{pVTga!Y-%_cU<) zKEr;xLLqqscOp$1_8@l8mw~)JIum%5CrVs8W+Cqfip@@QP%BL|5M@yV`06V)$lWTj zd!vy#&j^un?GZ50>CiqGZ0}$9-(R$zabGecv%il=jp=Obj;Uu!v#Y&x*Vzpioy9(D z;iNZ{`2LFcJM$fA zsOs$-+-L(rvUy7o{?Qx}Xz%S1aGTj(JERJKOP9=GN|hY27WU(dCtG%}L!;T!C4#i=V`WRAlB z^jQ9fZ!2B=kUN+e5f4Z^*};;6pi>v^pa)Y;x}MYLSFhIi*Z1a1hP#8ar{|}6&%xCu z#?4l(yIahGhbavxI!7=Pc=8o25mZ?{eKmr7BM&UX+Xg|E<%;Xn`&Ad`_IG`0hORVr zW=Cp2m2Ol2ohemcKcI=S_KPgAg=AgdiwN_9DOMb#syz^tS}D2&`>Coa@nN23H^bCL zj^fdcbk5q?KQ9R0eis!~>q_%E=-1`32oc9abf$zud>}+Vr|%B6M14D|A0Z_% z;V_Cp;wAw_fB>heW3e2+0OK-KcAnMWpYBBPSjUv`TB%r4$fCdO$GW#vjys395s)-i+hB@<1B3ZjMtP=&XNJ&lIX*Og81G9NMIafaxhR zt9Gp2u-p+rB)727N_A4rw(%}oX>v9HC=EkW%b8aoiMOOAF3o(UH=%f+iqvJy z7V3k^*HFg+GUd+ZKM8Tco=zT2$>7V zbM3o66m&3DyGiTSuKsM_cL|`L{xCrzLMQ6gILQMg%^MwZV~{<(z5nFnROX>LsiF&d z)ITF-FPvqxk~}Z=9s`KoJxh2!Qim>onarxyLF8-#7xOZ}@xyLTql%+~Nd6 z&8KS)7cZ|-J{P+)M18e4#2a0*K%RlbtynD>vKz`}uKhr~@q6_r(Ex1@BYi5cJ`*F$b z$^q`$rwcb7|7_ccyK!7_L)a`(?ArG7v*jiYCNwTk6GR0YK_rMwEoxx)6BRiHsyaUd z!blLGm~JqSIEZn?;6UO=Edn@p!?>@b09Uq3ef}C(qTK7+BwYw|g@LT$n=&PZEZ*2X{}x_+d0== z{hJIg5^S*(7E;ZoG6=}FA|!2$@-&l9O~lDiB*g`PI{Vyaf!~p|MpQCO79A*FqzKM< zaEo!jgqw_^TRx&Oq$neZuq z=PJ2*s$MiB162zHaLj=$U9pfrGf&NE-)iaUsH+{)c}GGLdbQ_s-dPTwY8*cCKGoz- z82<%8v&RuNOgI?HXN>rfPQyA9MSPGa*BwDFHy{?3F3^V zNYDvV@)khUY)2U-$+ZeE}E{u_twBzefL+WED7i2VrzYT~O4>zc7VEbTB>*r-7d-H}aJ1NvrVZo#D=@5(WPkvkqZN(1Ik6-}Ft=;&dg z^)n+-tA;(xRQRaG?%}UDg zvEFg)LP??*txRp3XSYI={|<57DQ$bS!xBSFEO{dJ>PiNj?WwX;um2wYOUFSwHsTU2DOfJ$^YvG<2<43z?P3J){=e9$7@hEPB zm3uBoF-6;qz~d;Qxv6+i%f5F;P9-)mr(CJ-Vu(-!VwCFIpU47JI+;}k1fmEMlQU8S zhl9B}T35?UMau|W(T2`D6p}j%hOD0`qS5Zs)}iFZ+_2zlFcC(Ihr0E_6F32ijzX5u zX`P^fUtmYMQ|`lSuVI8tjrnngcbPSCV8*N zQj6G`_MeW5iX$Jw=x^rWiR8FyX)zSo>!ltAA5ELN@lC7)9-004R?@}NAPMw+YI(-z z`o%j~7P{X1$=8sWI;)46J@-A6dbAH~GG7jY?Ae{_ZhbLBFbYkxA5a7syNAK|)M#hi zHp!P(F?rTOy#RH+28-YQ~7|>9Yr0eBpmA! z*=9i`srZw1Ln}9XL%v?!>clWy$TqSG9u|=g{4x8p zQRgH23BgYH>Q?K=K~(Z-+>2eMsofIlr0znu#H`R23!8v>7nLfZ1(`Nh~jR<|K9!45cgw1#NgIc!o2& zFIyddX+7xhJy?s85uhAV!mL&Nf=p(oKol!mu5`2{_l2Z8e5zi|N+D1S6U4Hw4a@Py zc29Z*ljmJyOmjJ@@Isj;2uT*HEbwLDX`RKT-7GWdk)+7g--eB+HFHQlu%G@mXwvRd zbgNQYb~>pU8`i==UlmjwnBehpQEB@+Qt~FK3FGe9>`v#cDz211cVY3IQqjbSNO2$h zK}qVA%&bLDQjw&@$}`vM851X0)CUq+MLMwT2MVF?T2Ii+Pn^I`h@wb;^@<5cN3w@DO%q1roKXzQ${hzJAl#P} z2{Foq@kgPw%F%0oK@UV_Yebj>8^mJxnfyuzxBX=Nho~`t$ z*!MnW=tT=(CRrTCM3ow0?GJ>L@k8$W?sHa!yQvFRXcOKLyZTa>=9)hSWy^WWKJko0 zofUYf_XeuG(3L=z+29u(Cm#W_D?o~n`cl0+>^wU3kLd$8goP7WL<;lc$owbn(Ej>H z5Dq?vm{a&hi#q^Tm!zdDk_OM@^vWvg&YECvl4N!2k;FeeaLNwSro;;L60a z*BK1HfY9wLrtR73!))gOENc^v?BED-l|v7&PRY|vcX%>% z7KxV*jU>wpn_)FDtMF?0Z;kO8Xsg9F24*Iw9aq}jODsb5Y4uJJS428rq82%D4TRsU zkdQ7Y4(?RXv^stZ26QpU-cpD6WUpgl;aZN|4g+MwXigRxQ&>^+B}{PQERKd8MiE5v z@y!bi+hZ3>X87Qrp%$Zkjsxl)S=*)!Sfp(VOuF1(8|i5LN~;zEX%^ep7p z>5n+IsPe3W=aWCtWD^WfumaWyA(CD_Hy5>zLL_X?t6z}F}3nh1K~5YFPMbaRhrsYfJ86VpJ|TF|=jB9(8+I-tq7##%X!aMYO*|AYppU zQLp&|N&1|I?xEw_tfv@C%FT`_6t>{!VAJl5A!vVULX_&7mh=o(B6BGWMFq==N!|+x zjOqGND)iN#!HM>SA^Ze-%4Z)cBJbZHAFTWR&?#9^>7Y$7LaV{mYB zIrkT=50G#YO6d0o*-xwHtzmO{Yu%;n!C7MD0v+NZ7UJKq+YVD&R9H$a`_70n!gDmK zT)`Srt}y{8-J%SwFwnekJ><+9UA37oPqwSc4*M4{SOI1N*DeLN*4CFDiOUV?Sw?Wl5zOVp@?^L@e#l*>soxzZb{ zQkrc2-C1^5K`n@hppJ1hT#6)lXx(;&N5bb;G^rULeH`J30&&d)TZH0gCCgZs(Na1F*z{Q)tWT zER&KvK`NnSX-Zs#VIo|eT?gT02?skd=CQ3OktTb?n-YoGn$XjxtsY4pIHXfb-I|+( zA(_&Gmw64WDUkK{CHeuNg3qv)YPW-jpP!Q3hWM1Q;x#+U&@uD_UX*mgWNDY3L4!fU zL~Sg&D$GP2gbA!V1wU81K-7|=$C0CDJJKjY8YBz}f1m-R%hwQFuWWup`8(Y;7C``G zdy7XiGbK?vm@u^O^-K*9k>yLFR`kXNEqw0Y*Yk4u{T`~t8(0P%U@83LhvuxlZ?Z8DR^Etsa(rH!CV=(- zHz=NKwM_sOBQxZ_!&*+Ql7N8!#P1ZjZ|JJ~e}4W?1Rd~YeInuE82p!JLG>RBpoqoS zKYJGO_6eW?|JIS;D=d-Cy@2(-z^Aq8KcD+pclJp@p?`AtKehh?^uPQh^}mIO|2@Ln zH_opA+WBw&|IY&Y%kn?s`JYGpU$K?5$MHt=zeA0%MRB`+E{boJ{4mIgG4(9qk;L&;%^hPpy1Dk%AKl*R~qaG_t8}wPKFijYQN=%xNIP}ia-9*s-Kr%)3?CX z>4#^!rzX#|G9 zX5a0OAAna^PtTkez@|%J7J0oUuxbT(9oFXX@mV*{#PO!@NBCe@zWmGJTm25`+E#Yj zw|Q;&z3S>U1QeJGtG(ZDL5QBZinhvC#`MVLLU$o4dN;Lt6RY;CAOH$}>-T(n_0$#s zul9Z|Sh&6L{)>S7*UNk*Wi$gK*2CTGmzG@Z7nAVmOUHWzhcde%1`m0-cadzNm6dV4 zO{IPWQ7LGB490XA{e`~wlFgt%&WYBvr0%?zvCaO>CzI5AG)qr(!@5B#+X&1g(*77p z4zvc^uN}cB|O00Tsw$QkgZoHYo+f20$%h&*bI9WsS+0 zKgh7Xo57fWfbO*;vJa_2GsPn!H8bMpQ#Ps*TTAk4voH1<@UdA5{IOgV9yD4zQw!OV z5=Ghqr-bCOaNG==GpNVGkv!c{-8<~X=#3W?8lgMG`}8-PQ_U7Czm|}p6yfG}h~bu> z!j1^W72iDZ?Ab4El7b;%jmBD65AoG9vd1!Zln8yNjt+KeNKl7qo_n5>uPdsFyEx>s zU4H9={{m6icoP3c>D)#5JgN_S<*QmI^OR*#y!JtNT8jE~tKV?8o~E}pj{+bQniQpk zY_?HvtuOXy|3-(l9pnRtKfcsN2xhn3cx8hQqswN`_nlxP8(`~&%U;y;POv{_OoUT9`M;3u}3O`sXP?R z$rwEz1%FX(XOsI$GcHH<@9X;C#b%`EQOV^s^N9A=MK#^}a8Tv}B-j*H0QW>=TQbK+ zdkgqONYjelXQwY(DHNM%-J-l667qN*#dD0RC@+K9*--hZ$=K%5cq-{AZ?+dk<22gI z8logQ$X!~5RtjIzYws<%Mpas4eo_A8zJVldGbPi7EVStto+dQUfi zJ*g`NYdst+)?&>r_)y~GOciNF>M9M#8ZDR+yIi-~uf`}J2&%v3O{;wB)##G7rdwf+jTX&Pn*_Y$XtWBhMF<^^?m*ISE9~2G*Un{by%(yTg4ID4c$z213wUe)VQzTMT#;{ZEIfX+LQJ`<>qQAcV03ouO1Ll8yi@05%U%ex0pU&_;=myko z1#@cKjc`0JUA77=%X^u%z7=>`95cNCeV%o3o!PWb#_5jZj$eiyR9_(onUV~^9#_1-^RqKKxW;97Xtd=t33wEi=?w&8_}j-9wk!r*^yirrD#!znz13qFs@3{KR>o5fdJ4bjd^GdH1&Yobff7 zH7w#6sBZE2U~@4|FlE+BEEdEhoQk}oilCW3*afhmc}#$q}X#m_eNiuVGxIXNHp~R+aE`Cnfq(8j&RUp<3?fGCj3Cg<1+0gW!}k7y5b$EZyFZ2usoa3A8qx0%Yxl| z2=cE6o2ZyxLZ`B(W;vSdM`Ofty9`3i2g_8X$Lv`=%QT>PY5$i~*<1XN?BjNmawi7` zoDIyS-uNJX6kE|>Pw=|>oBiYOfk-&ZsOd`jzm?$uBVy3=b$*G++=sSUzMWD00I|u=c#WY(+C9!2#QFMDS0!z23(`0C)LI7!uu|fh3;i;%-r1TEp05 z9~C+zqU5Iux;S0UlK}M<>qvRc>OLdQFZdc=yqc6d6FP>HItAeMdP zSLS-t3^yQcAU0{%%kX2e)tVEsp9A*6(Y8POte4pb?y*2J<)VN;m^gZaTBx6vPOCspamOy}se%GZB?)1R^PIlHD>_iRH*OC^aEV40J&9 z%t1+HZ~I%zN?N=%2rsTF__Kc=rCwLa4!Qgq`o7)9r3F@DnQmaDM;XF&!8~PE>jJ@r z2O*`&**M0!1s0{&>GA_N7V0PKwDO6?wd9WwqL##HnI=U;Y* zjV4a4`gp^8*TjT_Rj`P`c4>q=n997IsVllwh_?DI^Dp=i}31aUk@-q+h z)1Qui%dib}Fd^eN2&U0WudL)a4+hgYg3BT7GZ=p5>3JUFO4 zIHq&i;YHV%GI;m0&Xt8twrTY0{8`%xvV{oc0fnnzX?4H*0z{0n3u*YG$JCHC!oS7#tDJZpY=X(#d%RZO<7?BzFBMm+I?#qVUem2W>In-Kz( z5y7xu)k5F9gjmKN9rh-E?x1Ld1t+cJ?hRx3F2m17zY6MM}O*2~6 z&z9Kg>3N1)+cHO!{JwW7fS>xnH$Ncod$lGrp{f2nS*_N3=wTxc_-zM#9s^SNe#QxW zw-Etva{9iq`o1>%zLw&E$78^kF<=w*_p{yJzTfAaz(5l4^U&{g69_*CWCX4IUW&~_ z975g&rV#-z;(*Y}?|$FUeHt%^&L^7?pPeqBb>8>UaRflCx-P%^v?$>6)g#AU->)f& z&`oJDjB{GuQVgN~`A={)+etvzxaDH>V+g0`{kAvvk4L9pjeBC?dO5~@?PpB6vS2KI ze=w*bxNuC^&1WP;7Fa)MCh67saKM|B>9SJ7W zR8|dBW>|pBZD#M44GV2=s#hbNy4~yArL~dO;mql~t+PxF>TRLS)inBUTu?E+tzBjJ zfMeV9Ps!}@dJe9i=uRivY>WMCY`xg@rAy>9C038y)%!4IwWhcp3z{Vrs%LE|I@9+H7@F{89J%Mo}w+nFqQn zY*b_TqRUwQe3Nyu!GK`aCio*2+BdiUQ2?#^z0B`P9lwhB)bNVl;69iW4KNy%+Ud|2hF^9{*EfbXo zz#fDUc*=f+m7K?o`KO}mKR@I%oIYr7>~8n?Z$t&~MwfLt63xLf|B>v(gIvW44(;w; zc;Prsk^p$W_ppk=q?RO)y>P~M&L_!BSXc^iBI>x%ZejnQQR4t00hMacxx#36$ofpdE+=ruGmtVQlo z;vok^sSAm05=|1uFP^`0JUSV8qybD6U;Wry#f2@^4O}Rfey|b*-J1=9n?tLvj*acK zx;fyH!(x~&nw&E=L1n0(;7z*hNo}Hv92;$4tlcF%L29qF%wwBp87CHeza{m$ogU<> z%m_Pf+n-p{$%UjN(tJ`5`DJu?PbvDj~vFnsLjz3Yvh?pr->b7LvbF&)-Ozs|tnOCvDgh$DD)OjT)*@2kRp!S~*_1B9XpY3x&>K zGM=W=4mDcSQ0Qm|zd@C-rU*JK_P(r95r;g~qIB$3mr(`q@0j-Cr+rhivFH=f$<~zZ z1>nbIW_P0uxcHkw0v?=f3%KYriOp3zgX}hEro@OP&y9k?yw+A{TzpaJpQ`>eSj2JD10 zoe7N;BNV$=ipVpj=*O&7^+GkrQQg?*saK!L3@I?Y!>mfO z&+FJpZ9K7l2G{k^J38no#q_738(=eNz}tZ!R1Z@hZ*7;|MiYNTTZmnxGu|CYPO-Wo zxpPTN(I%dAhz<3^fRdk-F|cwxdHnfsS~+IQsI?-=(g8(>h9JHI5{pm=J&4r&-lK@r zyN~AN@^6Lx`rux9Aey7~apFbDV?XYJjS~`_*n6$XBIbE2YeBn?#a1zjnSHeqBt$Op z8A>4EnS;$AKwMl-zi^}!%x{g;aKYS@UYE$k;%WZq1HbWyvnj(klK&! z5_=I|q@svLd*j8}ev?%+lGK+#v_HB5ChGJiK|nXOz6G?bS3|IE|EOxN=k!z=M>l!c zVH@u%1!nArXKQ1kMIt`I^Zipwfx`?>Z*SQo_O&ogkw-s54bF(zPzdh93&|vMt<`;6 z+n2dpn-kQJ2E;1^WBj)*h|PgF6pqQF8FeMOSj|w`{>CxwAexEp;&2T9UsDDR>(BLlDI#lO~3*J zA^Z<;bR`RZ!d8V_Fp=4oTQ(0Bc8ArO`jdOahn(}dYM58cLU9CvLwi4%!y-;^6i3Kd z)+R?e4sJ!j2LxUNoHpKb-t|>g$DEl7!)}Md^ z`NTcEr9u}J_ECi(z5Ehc&WPnQtA(;r(rU%O9hHXeVgWzD*j}2lCzF$d6&#gA0d<@T zVc#L4!#>^5h-}yQpyJSeL*NLy*lo1~IV%26_sSG%M$U{m;-nB&olH!OeV|ML7etK( zOIaWD^Z>npI86@})U12t$RxKN{9t~|S=7!C%6XSTGQKA{D_ss3fW6CPl36?YOD9nY zcg$TW#md>#Xq29$FMALmfKpOam2%m&SB=OPy~ICfw9KZYC?>Y37FlC0@s&vt>!wgtb-=SGt!Ne&Y?;x| zS_T8~FIx!YCLzy;U2=!X(G;!&U&Mh>o5SI%P+`f{hO;UCvDO!9#zuJtS3H?T2rJwd4q;2r4%=}1|oHMI>f5$~si z?;en|6nr8za^o~c_@e)>UrJYNd-b!P@o1pGove84UdgJxTzH8-4a0BBZq>RN!jrn` zU?ZdvJb%LNEtRZu!)!E^iI}^DYclV?>V&wt8Y@2XWCZ&zr ziHrr8wiSh);BunOt#bQ8>R!^OlIlk$9Pd&A^}R$@=NP1aRC9Y;U-eh7f%=ht+bZ(I zN^k6~2&M893i74*yf$ds0JE;M{4jZn!_$R~PmOT{Mf-k%Y~ma1(5#^$U|Mbjp#I6$ zHDYQe)s<-p!`^#N%QXF2Fji~qB4Nt)r*EbJu;ghTJevIl*44|jVgNk=BhQ181b2Lt z{)2 zh8R{REr2+3p><~@d>DkUKVlpNWN-!Cujj=)o?g0I&#xiV*|qNBSa9ht(IJHTXW>{? zAd?VPg7VrW94FdUG~f#mU^c$*U0u!UMgJ0m;Z@_ehqx}Uo{tacF6gTs`LNbki|p!4 z_zhVKm0y{u;O`^`PX&v)ie;8;Q(2Mpi&3~DSE7eV-T(p!Td4yoX zrA417i9kI9Zf&m7?-i$%(haGwV+_>MAZsctWZO^tF}w&WW_a_LtJ6f+nT znjJLsF1i|k4mW9LH%3m^f&7LV@5U_4?J z&;euPc!`2}uHuXIZ;A6Z7832{o6$^B8<~^=7Z+9Upo=u(@@FH$?j!x0()H!L&X4`seV+doO}AiT=$ec4}vm1 zmJnG0KTPN^)P0wHyK{0c<|({-=NYax#v9RBk1W z2nTwzp}~w76HJ)CCPFi2Qt(HiaAh(AN`=K0w1x(aJW^R8huM6p6M_oaw5!uj>fRyl z!r%^zV_gT>zg0}VT|&jvTDYp4QA;KhgOpN{cudT8Cb=>LdK^XzW>m(&@>{~jXuC^WaIKTYrdIWo zkVDrs43%~m-n22{tDVH9|dyGm$RMrj+Gji{9csOD%Y&i?pJuoC~! z_z~8z&QwDqWrsgq;(@-gj7`89EH#S;`Xdrj%#viBK8e#jh6Q#v0SXI?2moIyM-eyg zK{7k{P@4Hp1`r_|X*Tt3|1I&rB=o9}h}sW(*#TP}L@f3|tcsUks2z4#D9S)n%_S{& zjZR0sK5w34C=ud4g3KWz+d^`P{Ls@vYH}A!Ut@-KS5=7-Ul??XE2a+L3}MTm{5Blh z7Qa3+RJ`~lk1oM`W;Kzb{JfnHZ6Ukat=V@KN&2(s9CzO=Wjhlda`NTmYzBk4==WG~ zclsZPkyV-<%B(B~5}bXk9MMo?CuuVaxKW1~oo{?M&VvIe;@8Vd|9)op_$31I(_&x4 zo0{E1ScP4N?m(Jx(oH66iWuY}GoUbyr1p6BS71fXG!4y7DBGm1!be;fmtI!1=OP0;?r($y)ar zsDaC?-)Cheq%)y7se-pWaMaubYASkZiGvZIehEsil2HV<3&NE&9pyO1jBZ7HowY7i z^Qr0^#{=LqS}Q(q%hL^{ReR^!$vP>6{pq^AVr$x+yV%ilRyI!~H;-gO0lR4dwAPy^ zmDN@QDaB@R;vuvlu*>2>kurM+SY^d0KT#)Pwzopd1wZJeJl8ub>ZAo8CDnowBsH5S zx&&AH-?_r!-<5VGzz7r?>V-l3f#>~4DamoR60v$U&Uic zl$2l&U|^x0J0-^*8MCmO8EsB=Rv!81r+Xn-EK?p(liCw_E_Ow>eJ@^iohW@@3$E`8 z(uR-_-;k*H5%+;Hi&I%%lM^D;R89O?$IO3M>E`wMkNoenHTAY@Okump)`XCXJsSH3 z>4}YKu$ku&Gdv6xfs{1B*}!#f2?g0b0mg>$d)WTr6&L4s7%~?2Pb_3lIwI@604bV-h@Pr&09d+WU@c zBYd_*7CsyH4DEud*JrqdPDcjG@m!0M4g%d584-2cD?$&dP2VDx+2|&@XX3?TjFfZf zx>Y6@Yzn>ymVg-ygv4C`qszBR+St@%>%XX2!QA4+&YVhd`J<^Zbjl4x=`YG6KEf5YR;NeA%Y1$~m`Q_SAqvWWT>;N-yxp1~1e#q5 z-Oc)hWVGsHQ*cZ4a;pzZ=KEShg$a2cKtp57o`>K_J5{w85*mM;aUq->E&ZiU{u>ii zqr{TvbtaJsaZ7W^1C`;Pfm`Z+73v<;{L_WBJ|$nD*7KSCXMc*Onqv(pKNaut@*QDy zdAHg$tWuafIn6i&A=C)cOjcxro9Q-Dq4+SV6kZa|k=4m;l6bm=zl&%}p22qIwC4GE z8Idbn;u-@)T`L<$=H-0GPo{?>6CMp{5qXZ;PY^uQ$@J-Br4NMEZX>?qSz;m#+V}9x zhr!d|iu(?Nb_)fez2i&pb=YK`e>z(a2KU!ipr!hLeng(ruau@+HvVhy6gNu4_MNmy zZvaFN2UzDM-Y7?@sb3;NsMywMdGK0%U}`WB`dJthUGZm{kbHU)k$}#)5IzmA@KlT6 z1drDV97;PM*OzTwUeM4rJwaOwZAbN1RWZ>)c1>iQ&M0FcR2SBV2_l6_UUSBVIv?jNb(d4xdB}~nQ z2Cb77+^X}AsP%DMDoWJJLj}Yoab8Hi6A*O!k`U+4G82q!$hw8;mqq{_uU%u-tCT+q zrbE!+d*ajH6J?~dwP$>Ym?^8QhT>`|L~1}jN69yP&>~&CV|wBrI{aQ%F-p~D22-+U zL5ug8O5W7MWEXIWRG30^_OYKdmqlyH4e;)N(8Ut)_XebLA#{s|7tE9MOZX!U>O+zo z{W%=ABp=EPd>g96%S7;h)7xpAW#f-`CaKU-0reM$(@-=Aq9@DEb!!rwgeEZarw3)F znGDd`zBRe0Y}D(v=nC^Ebl0Pz6+RPNn@KHnX$50ezfvgkvnjRJuIRy4er?^)U|3b- z^EwpjMBEEk{!9Yh&`xj~x!xhP7CySB&uNzfVR}(1XG|eX<=l>xmpCg)e+u91V5#@d zsfDR=O4&^803frS$8>KR<^~``pRhUu7@DIFW|GX_415zj^^2{KOsr8Xq$KUExo+5{ zuXB&8sR)?KaRrn<&0g*Uht#}_v4^S-1=_T7vFAEiJaM5(-2!rNk z=0`=EL*T+EW`l^!{x|%`kl8qtv-CU zuM;B}@7pTD;4D>3ldV$lSv;fMlENIC0S|ynLpDI!|6(`7>nqv~YMNlj34(E{E|hFT zASTF*K%4p5o^4C#AKW=!Et&MF6%Fw6WDgV&JgMh0nzTQQXkXs(VT|fZgGCuTw!1nT z!Fr-1Dme;N3&;oVRV_)}H}v^a%OPIGeOB3%?J$8{s>n1T)ahO9~Gb%#h=UG5rxCO&O0O>-A4m34R!kW55(- zFWgPbpGGIGk~wIr)%=7dg~${5PZBQJX%xyg)FaHB)(V%Ev_pEu^L!yd;yjy*MC+V< zK!9P8jO+84l@+><&6AT>RgK-ynRcI%bHp-}vRfKu$IxexX^qkc^=sb`h!iOqUR~4fwe$0y$4CD5_APMk{>_^tFAM9l6u`5UaZ~0P>FBz<8{g2f-bV@J#jKiR) znny63y6c9Rx!q&x*2k^=UH`z3yTCy`tC&OzRnfQoKLUgtd*ddC!Kftr^yHM|b zv-_Z|l2y3&79T;2XSGoi78%@66nOUw--hVW;`KuJNXuz3Dc8 z*W(yq{G^w?>NS72#}XEHrmr*jbZU4b;722)L)?01qP(h0e3flqILHVm`99uM)a>+4 zWwHBxDYc6oBOy^vt)|qe#;7}GWi||P!~b_5{_*J9*T+wuf9=lS&p$c;hi~2N{NHQu zqx=WYHvIo{d}zjn(`j|uJ1zK6Mx5Tp>l?wxX;MEwIeB>e?DUv!mX@;j zIJdisg~|Rc8u~}?Qt{>RGQNz+k`jB=GJ4cgJ^CZ`17mZjT-bcbB%c9ShXeP~9Vtk5 z(s(DGV6;hejDucY`^iY%6@<}{Qv9HEo)|(0E+~$g>GnFN8*nx?qVp|Xlc^iH%%so= zo{*AhB!iP4b?4`+uA00$W=NRFHI@Eg^}W>jxl0i>@h&Q$VE1%|7F@!qJ;uncwak@{ zVz|;q04>N^a%z$k#s~4>+Mm1&k_Qidd&^7oc57cv%458q(DB-(Wo{M+i0xyIMxnP$ z|J}EK82wgu=(bJwh(-?Fy)qiX?hN6Ge#y?!v@Ler1J+N-xVAzkAx&>hxH6AaJ6k6& z1HRJDIT><`V?U+2DzyW@d*cV@BK3u#J(8DRD*nh_*Qai&E0NtJWVZm*JMEs?`uTb8 z`V3>Cvj(jsSq@*Bou8Ky54-Zn0JV8a^752);g7qwCLuYly#te8*exidmo6}%PS()L zyLZ9eXcfcv6ZX0W_Bv+Ml!JS|oW*I@-jg@8OwH94Uw#`#QG7*~D0l0|!9nv*_3pRK zuBydziCh>bib87hMM2hi;JMd8?eD^!X*h|~@9x&)`wz^P^|U+?%(t`Vu2B03+r}N| zN3oJl+58Z7my$1Ao@hI1^vl34Mkmsf-IIO#as&mhgTX*x)Sk(2Z*8z7J4w5A`@v4T zz07MmcVrH|`xYxCmk$guLJdcY=^&t>@$9*Y7bh5zqut6n z0o&PRc*nLMNVGC(A0S#g?QCPEWhS>U7O09oy(ExY=U8!6%R+PH3M*jR%b9hT(pcQr zmWbpD&6MTZ-6^=JahSk@2cMpAG9;JoYMIk?W*F%BW#p{Whadrtnldy$8%U8|bK7k- zRM$?T;bbuiOj~#k&2C6KO>&4KFPlh{ow}tZ7kPTa*bTSXK`@SU z5r*^35aj$MN(al|eu(S#wqUA}cA-e1_@Jd-3r@DCoWOWMUG#^;aD;&+COC-MB=$$z zrI?+JV+zzPC8rn57bh@QTn19GV(>0f>z?G6dpoUttt zjgv}ofyMRaVKB%koHO3-O#SZ`>uhjUNbBs=D(gw+1^wRJX5rz(kK3P~>`%++k0!M8wRK*;hR!pg;8tgh%C2?P z0a-1dbehh9HTd7D{yj?KStcQAGQtsc`H0l+p~ztD>ywF0bj4X);<4$RFIO{r4^<9R zA6kJa4S}b`Q+odaLv26!tzM8)Bd|#3!2UuE36nMikEo|c1j1TZjp#K-lQ`E2>0R>8 zqF$2QrX-_aRB-LPQ%4W-9i7LEX`ICG;`B09{p`wq;^DNLKPoOFv~fgLLE;aIq=?$l z!VhSRXT_WctswZad^%iivtzVrNwGT02ZvrQMwtNImV`D(!O+ z4?CzGdpDlL{+V(BS~@I{2?&x10#zVQMnvMatSWtavKK19W|pfO14>DMXc_KAm48iU z+B2DN8J;SXPEz;5WvDDE4SdQvFK8kng1@QfgHxeN67!sjjcE?NQ7T zQUf&z^BskGI766%eir9W@sEvW{O{fVZ#cgAT=u`Mj@JM0wObqe-_Lpf3)?_2IjezG zin1<+k!jazZ-FL!;G;fX(rSaG9r6}F6q%V_O&Xnf@{PPEz>6aQ5?ow(XzOu?Mj;*< zc0d{WK|J~p)A4QA;LmOSXVd#R)_FtsI$6ogU9=FN0jDaX}8mH3shhZ|D1jCRd|BK6VWfk_|4Y(umJ3~dP^21`K3cyV-kdi-d0vG#h!I_nkdt|*pgDzajM5#9|z#tZLO zzrYS}1S462go5k;mQ^$hShHUH_D!|#))cc5SywY1qi*S%X?LXU7HkDN0uZx__C748 zVH}MrR*_uT+IZcu?n$i`T`+Vv7xyn_f8Fd^A9K&TZ*5tvwy|Y7Q9KX&+HOEo6$ZrN zSh?z2o}Q`*E||fPa@Y`Dna{08T9e9KI=#yU?}OojB}pRtizEo5jK=AwwLF2wudeJx zD@E5F`st~w%dt7JU;1=V3Ze7C5V{`#L9GY7aDFM5z12&#>}7r_miD`4*Mzl^>#`*N zbr656%1r-ud9`S26=GMrlhLqni0h_@XiQb3jG~hX*%H;P#ZWW2XgK32))a=N}Q-ohi--S8P!*plJTDS^r7p!vhG~1cu&268K zVExO$9|g%y5?`l%KEd_V`C_mGLeF9v(X$%eRPvG*C{=abee=gb_M_|e%pZH^kA3rp zRp-9><3aZ0#ZrBTg`LGXW)o)UQRcY@-mxJoH2IVGG0*P z9)CQhgQkn^n?2~Mtc1(JJij{_x)7j~jW*fF$+(8y9(1Qx1ET2X2~|r~82mFHl98dz z8YnB@Z&PJscUjj~`=EW7THW4VYTbv8=}|BX0OipzgekMPONT-qrU4%SCczj(XwK0> zKBly_VleTecergIzrO_elMX7c$vEp+Dm`i|#M{~{^7Q&Le=9_W=ao`uCc~mxEXKj% zFupYm_^I+Y7$JQVWd-Pfgx)wmr`+9sW_-n-afwV?r$PcJH3h3*aYb~?s~)a%PaNf9 z4%ftr8y$6lvu9jVI9<}%t2-TeA7Lrr{iYa{UO(9RbHs0~V#OYEG{Dt8WYpH%Exal* zFH@`+`%MZedDz~s=r+(5W}3i=h*_6ZrB>AttXfnS|7nyBDzb>9dSrJ0U1hlEY=4`^ zk&BkssWSz~6oDRcVN#ae0I3>%r<8=-9*z9-ugqRwoXI%+e{#|^Y< zkrIN(UUISl>V#7aoo>hZ;SRU!7$3IeMaO<|R))4*lVw9y#;Z;)6#)$umKcZywP$de zrTgHfGVi1?=8-np=f$f{_M04R6|T02^~eOa>?Ycpxv5j%`(X*gf_>`KOY-0~^h01yf@3YLRh zNM1EGv!p>J!OGyx$T3v5IHdl}$y(nRm8wxsZ!Ky zdtIutx4O=!P*rxSRh62zuTn9>QGkMN6W)+LVn!deEaE&(yDH7oI84l#F_PBFf2GN7 zO2-?uLHOhxD!t4>{;kQ~K!#7C5C&|Lq?VL5g?v@V(6S}0>!-Ez^WqF@(Y82Ik?7<>8-jgOl zkU3cO<*2j|A@0cVYf7UzS6OeQV4~c53Mg=Eg%o*$@xj)J4+g-H%(!T<@~(npnxI+cQa#^ZyHt?4bY5C^V-<`WNeqR z^AbTAF~TiW$|H)G#SAY>j2r>nivO*6j)qeb4cy8ISd5Tf_v-GqamZQb-gEko_uAQ; z^GY?$^c0_JBdORuO12C$V{IO-pG=tfID1JOIMHqP5h(pL+e4&uY@X*;h!!S_6hl0w z`Q?UWg(+yzy*?a=L%D?@TM^=9o)^mSLZZMR$)(l6`^QuZ{L4LE*G??&OG>EWXU?O| zvYFuA$eQCyE?7f_U}WsdyreVlXpGky^h2d>o0qk3LdPB%*O_^*oCi&@pJC|CNc(N{GlwK~tB5*;bx&tIIc%)KE_0}U%f1AM zFsFmVP6q6-duB4tidsFawP)0NVAX2%3qxa+^ZMS_sIwS!`=(k7yPuRz_o~_Sm-v3Ebi&m;a9a2r>a*rgmj!!pDWx%YGRzFwr4q znhG)lf6TOY8`fav%~_pTFPA6}zkBVHTzPFHS6*42PFa3E!!#KagU%PJhvSA;yy1273Y0AGYhtT(%hf#!-Vj zq#Ej110(8N?a(qs7~Xzcfyr5@(tIK~XpDf=mLI4>!FO0^N`MWoaz z#RXJcT$>r?q>+>*?#kd1+?|oqD3o=&;=ocQdtB`%`hQqg+Q*F!NI&0jm=D@1i zSaa(`51Tq1-6oh4mE39SsQsIaeqFcSYPgVkXYYjsB=wgfgE71e0!*3F$b-RR*-O0z z7L)zjB$;Q2590_keMY34cd8wshE%SCADDb+wL?^e$Xe-_!_7)#RsP`?y6v?*LaIkd z^@@l8b)f)GJ;te*L4nWfR6F6G!Z%nGFR~nr?urkcCuQzrtKp^-JCzXq!uw8S&eR4 ztN3C5^dpaeIe*FvQsE>XhTieM3zFEOrgN^8ayY-o=mMxUZwg>FXvHCQ*&%cFlu?^u zV>?W@vukcAU7*6&v}vFbG-UQ;z{~b@k{n9+r9 zvYDEIfM?FPD@nxYO+6+da2Ag0IoHYOr}-=9k`AdiIf&yC8e`O}UN5G8`mSE^=H&|< zsj{WE+VU?DF0|I9F?&>7e&>ed4<3if@@a;jk(oZNT9nH!;|YdVOcsG@=ddb3R_$qc zA=A&w(A>oUUmP;5Kuom{IPBM6#bQb=qh1fEk#gSNwhKT7ZC6FM!h^P2e5_eT1DGZ} z!ti2@h*HS75NZ@iEcXWR({XipGBgQEf^m=p(U8~ic}bWr39qEDnVor%OvKJC6gz>~ zN_UGea#nR0TQs&Eg{IwFt?PA{i%F8JDHO%AVqkpIoX5Szyx+JY9>nX}d{Rh^n zB;kcrs?c^w&WP8*+_fR2E4~7j5XIL<6b0P)bOCkaM(_y8)E~)g$=Ezce%EJ*U&|hj zVlu6q27bh}ioZzaDtCyibBAA%(E^&tq*I)bp?`&2U#gML7M1!=G>iA%H{bF>K|8Zt z%E*7&o+r0%C%{D6QvE~4vTIg2L`pzLyiMb^+LVBWHw(Sl&3<%{W5(DKnM&92tT7BT z(s;!MEwRV!%J0qPk_NU&`8Y`KmG0C}-nkM0)>lOEmGtsSX8{LGM)T8fJPwC&^l-%y z?Qq4tL?y?TOAaTHMZFl89L!3#iO}^kBf(KTN#A8=;p@a0bwqt!%AU;Fa-%EA0v|Y~KYy-O@uO7@6`5 zBNVYhVgYYr7^M-0x*cpc%p7{I49u9vr=u?yu!bfoL>i!WOX?pdj2n>H-A#z7&l~^A z2;%iQ;=grUoqd)6Yp>PqQ2e)pP5igd@_8Li0=oAleM*e#o@$fl?8n1^1dNo8 zMM+}~jB^;zmI)?U5uH}MB`CXSO=cGrzbm8?{XOzmkSnl8imJvSxgr++GQdnS#IW$N zN}j*mzHA$x3}Ek0mU#O)g>G=X(nOs%Ytwjyx6*W~ZqlAP!^ACf91*7c4Cz*sZcR}! z6=MKgK7&Mj-^8}4unbsqX`?J;_KGZuWOr!%v<)QzhT-H>1er5sC;{FW4g)%Ykv*(B zD4Q+HBS6+2Xb~j$a0&>cZgh&>faVNTsBUm*mf%zLMA3or((si7B~;o)s{qmuPVrD4 z!U-`$x90KY0MJP5k0+<%^!ejgZ;oCb3;6!xg3&6ZQdiLt%__Qfbo;`f>`q9a= zubbkl*RRC0=dZ+*lcy)IpxCSDP4ViF&|smOc>cKd^!O#_yn1!?)yb2SSKm;3k567b z!?qqje<_Z{i=&sXP9DB~a`aNXc>VIl^V4I2{eN_F`tZro$9U)}ZIlUWwB` z9zA)I8xFvE`25+cmnYD-=PysiSI5x1qpzMEa}zMUM<*|jAHHhVPM*ncI3mCebnHn} zoW3}Ic!FP!|MfA9;^^f!O$qb#_#a+FA$SQ*K0W#x2IXY9sFmRYu>SD%%j2im+2@bN z>FcjfU!A;q{pwhJ{rveO#IQI$e)(tE2u^=1o;*jKKNhb~kDIkeN3V{kVE_R*g4gi< ztJkL|gsqcjuZ~~7eEs6p$@6Co@yF+HXy^}*pz0$+>+@$cRG5qBFTX+DBMu1bP4VWB z$MF0mVv;a*geW)#j6HlMjAGCpAn=tjM)BnA5)A3u9|T!XjI5z3pB)8htA(#a_n zIN@gB96_6}X~;+o&@29G&?Mj&rcj(bt{px4^9goa7KTYbJ&^=LD0}!viEe3ocohcM zyqZwuH(8{#x@5H8OnaTi{9H8a~4MhlLO8zt`*R zw>uqJ_$~UfS^uBoBW=#oWm=<4Nxk;nA-a33*Erd=S~wQUYzmD7>Yg`+qpj!F`MMTf z*C{V_o$W{>1dC2cS8v<>Gs8lQ@*HMa4xPFTQi6&0i%M~&O6tpfdS$*XG`S!NwZHk9>3>3U|MC4-J0)?04dcx+_JIJ{{%s)OqeOE%Nk zFy75)^VxhhpUr3U*?cyi&1du3d^VrWXY<*7HlNLB^VxhhpUr3U*?cyi&F7}i{||r- J6!QQu0stYycXa>& diff --git a/parameterized-0.9.0.tar.gz b/parameterized-0.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5ceb55a13190fe9a83a8d71b137a90bd78c0dcfd GIT binary patch literal 24351 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 literal 0 HcmV?d00001 diff --git a/parameterized-pr116-pytest4.patch b/parameterized-pr116-pytest4.patch deleted file mode 100644 index 750b150..0000000 --- a/parameterized-pr116-pytest4.patch +++ /dev/null @@ -1,537 +0,0 @@ -From 674f23824328709562303941e9546097b360b4fc Mon Sep 17 00:00:00 2001 -From: David Wolever -Date: Sat, 9 Jan 2021 16:00:47 -0500 -Subject: [PATCH 1/6] Enable pytest4 (tests will fail) - ---- - tox.ini | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -Index: parameterized-0.8.1/tox.ini -=================================================================== ---- parameterized-0.8.1.orig/tox.ini -+++ parameterized-0.8.1/tox.ini -@@ -1,5 +1,5 @@ - [tox] --envlist=py{27,35,36,py}-{nose,nose2,pytest2,pytest3,unit,unit2},py{37,38,39}-{nose,nose2,pytest3,unit,unit2} -+envlist=py{27,35,36,py}-{nose,nose2,pytest2,pytest3,pytest4,unit,unit2},py{37,38,39}-{nose,nose2,pytest3,pytest4,unit,unit2} - [testenv] - deps= - nose -@@ -7,13 +7,13 @@ deps= - nose2: nose2 - pytest2: pytest>=2,<3 - pytest3: pytest>=3,<4 -- #pytest4: pytest>=4,<5 -+ pytest4: pytest>=4,<5 - unit2: unittest2 - commands= - nose: nosetests - nose2: nose2 - pytest2: py.test parameterized/test.py - pytest3: py.test parameterized/test.py -- #pytest4: py.test parameterized/test.py -+ pytest4: py.test parameterized/test.py - unit: python -m unittest parameterized.test - unit2: unit2 parameterized.test -Index: parameterized-0.8.1/parameterized/parameterized.py -=================================================================== ---- parameterized-0.8.1.orig/parameterized/parameterized.py -+++ parameterized-0.8.1/parameterized/parameterized.py -@@ -19,9 +19,14 @@ except ImportError: - class SkipTest(Exception): - pass - -+try: -+ import pytest -+except ImportError: -+ pytest = None -+ - PY3 = sys.version_info[0] == 3 - PY2 = sys.version_info[0] == 2 -- -+PYTEST4 = pytest and pytest.__version__ >= '4.0.0' - - if PY3: - # Python 3 doesn't have an InstanceType, so just use a dummy type. -@@ -352,6 +357,120 @@ class parameterized(object): - def __call__(self, test_func): - self.assert_not_in_testcase_subclass() - -+ input = self.get_input() -+ wrapper = self._wrap_test_func(test_func, input) -+ wrapper.parameterized_input = input -+ wrapper.parameterized_func = test_func -+ test_func.__name__ = "_parameterized_original_%s" %(test_func.__name__, ) -+ -+ return wrapper -+ -+ def _wrap_test_func(self, test_func, input): -+ """ Wraps a test function so that it will appropriately handle -+ parameterization. -+ -+ In the general case, the wrapper will enumerate the input, yielding -+ test cases. -+ -+ In the case of pytest4, the wrapper will use -+ ``@pytest.mark.parametrize`` to parameterize the test function. """ -+ -+ if not input: -+ if not self.skip_on_empty: -+ raise ValueError( -+ "Parameters iterable is empty (hint: use " -+ "`parameterized([], skip_on_empty=True)` to skip " -+ "this test when the input is empty)" -+ ) -+ return wraps(test_func)(skip_on_empty_helper) -+ -+ if PYTEST4 and detect_runner() == "pytest": -+ # pytest >= 4 compatibility is... a bit of work. Basically, the -+ # only way (I can find) of implementing parameterized testing with -+ # pytest >= 4 is through the ``@pytest.mark.parameterized`` -+ # decorator. This decorator has some strange requirements around -+ # the name and number of arguments to the test function, so this -+ # wrapper works around that by: -+ # 1. Introspecting the original test function to determine the -+ # names and default values of all arguments. -+ # 2. Creating a new function with the same arguments, but none -+ # of them are optional:: -+ # -+ # def foo(a, b=42): ... -+ # -+ # Becomes: -+ # -+ # def parameterized_pytest_wrapper_foo(a, b): ... -+ # -+ # 3. Merging the ``@parameterized`` parameters with the argument -+ # default values. -+ # 4. Generating a list of ``pytest.param(...)`` values, and passing -+ # that into ``@pytest.mark.parameterized``. -+ # Some work also needs to be done to support the documented usage -+ # of ``mock.patch``, which also adds complexity. -+ Undefined = object() -+ test_func_wrapped = test_func -+ test_func_real, mock_patchings = unwrap_mock_patch_func(test_func_wrapped) -+ func_argspec = getargspec(test_func_real) -+ -+ func_args = func_argspec.args -+ if mock_patchings: -+ func_args = func_args[:-len(mock_patchings)] -+ -+ func_args_no_self = func_args -+ if func_args_no_self[:1] == ["self"]: -+ func_args_no_self = func_args_no_self[1:] -+ -+ args_with_default = dict( -+ (arg, Undefined) -+ for arg in func_args_no_self -+ ) -+ for (arg, default) in zip(reversed(func_args_no_self), reversed(func_argspec.defaults or [])): -+ args_with_default[arg] = default -+ -+ pytest_params = [] -+ for i in input: -+ p = dict(args_with_default) -+ for (arg, val) in zip(func_args_no_self, i.args): -+ p[arg] = val -+ p.update(i.kwargs) -+ -+ # Sanity check: all arguments should now be defined -+ if any(v is Undefined for v in p.values()): -+ raise ValueError( -+ "When parameterizing function %r: no value for " -+ "arguments: %s with parameters %r " -+ "(see: 'no value for arguments' in " -+ "https://github.com/wolever/parameterized#faq)" %( -+ test_func, -+ ", ".join( -+ repr(arg) -+ for (arg, val) in p.items() -+ if val is Undefined -+ ), -+ i, -+ ) -+ ) -+ -+ pytest_params.append(pytest.param(*[ -+ p.get(arg) for arg in func_args_no_self -+ ])) -+ -+ namespace = { -+ "__parameterized_original_test_func": test_func_wrapped, -+ } -+ wrapper_name = "parameterized_pytest_wrapper_%s" %(test_func.__name__, ) -+ exec( -+ "def %s(%s, *__args): return __parameterized_original_test_func(%s, *__args)" %( -+ wrapper_name, -+ ",".join(func_args), -+ ",".join(func_args), -+ ), -+ namespace, -+ namespace, -+ ) -+ return pytest.mark.parametrize(",".join(func_args_no_self), pytest_params)(namespace[wrapper_name]) -+ - @wraps(test_func) - def wrapper(test_self=None): - test_cls = test_self and type(test_self) -@@ -366,7 +485,7 @@ class parameterized(object): - ) %(test_self, )) - - original_doc = wrapper.__doc__ -- for num, args in enumerate(wrapper.parameterized_input): -+ for num, args in enumerate(input): - p = param.from_decorator(args) - unbound_func, nose_tuple = self.param_as_nose_tuple(test_self, test_func, num, p) - try: -@@ -383,21 +502,6 @@ class parameterized(object): - if test_self is not None: - delattr(test_cls, test_func.__name__) - wrapper.__doc__ = original_doc -- -- input = self.get_input() -- if not input: -- if not self.skip_on_empty: -- raise ValueError( -- "Parameters iterable is empty (hint: use " -- "`parameterized([], skip_on_empty=True)` to skip " -- "this test when the input is empty)" -- ) -- wrapper = wraps(test_func)(skip_on_empty_helper) -- -- wrapper.parameterized_input = input -- wrapper.parameterized_func = test_func -- test_func.__name__ = "_parameterized_original_%s" %(test_func.__name__, ) -- - return wrapper - - def param_as_nose_tuple(self, test_self, func, num, p): -@@ -618,6 +722,11 @@ def parameterized_class(attrs, input_val - - return decorator - -+def unwrap_mock_patch_func(f): -+ if not hasattr(f, "patchings"): -+ return (f, []) -+ real_func, patchings = unwrap_mock_patch_func(f.__wrapped__) -+ return (real_func, patchings + f.patchings) - - def get_class_name_suffix(params_dict): - if "name" in params_dict: -Index: parameterized-0.8.1/parameterized/test.py -=================================================================== ---- parameterized-0.8.1.orig/parameterized/test.py -+++ parameterized-0.8.1/parameterized/test.py -@@ -6,8 +6,9 @@ from unittest import TestCase - from nose.tools import assert_equal, assert_raises - - from .parameterized import ( -- PY3, PY2, parameterized, param, parameterized_argument_value_pairs, -- short_repr, detect_runner, parameterized_class, SkipTest, -+ PY3, PY2, PYTEST4, parameterized, param, -+ parameterized_argument_value_pairs, short_repr, detect_runner, -+ parameterized_class, SkipTest, - ) - - def assert_contains(haystack, needle): -@@ -40,6 +41,7 @@ def expect(skip, tests=None): - - test_params = [ - (42, ), -+ (42, "bar_val"), - "foo0", - param("foo1"), - param("foo2", bar=42), -@@ -50,6 +52,7 @@ expect("standalone", [ - "test_naked_function('foo1', bar=None)", - "test_naked_function('foo2', bar=42)", - "test_naked_function(42, bar=None)", -+ "test_naked_function(42, bar='bar_val')", - ]) - - @parameterized(test_params) -@@ -63,6 +66,7 @@ class TestParameterized(object): - "test_instance_method('foo1', bar=None)", - "test_instance_method('foo2', bar=42)", - "test_instance_method(42, bar=None)", -+ "test_instance_method(42, bar='bar_val')", - ]) - - @parameterized(test_params) -@@ -95,10 +99,16 @@ if not PYTEST: - missing_tests.remove("test_setup(%s)" %(self.actual_order, )) - - --def custom_naming_func(custom_tag): -+def custom_naming_func(custom_tag, kw_name): - def custom_naming_func(testcase_func, param_num, param): -- return testcase_func.__name__ + ('_%s_name_' % custom_tag) + str(param.args[0]) -- -+ return ( -+ testcase_func.__name__ + -+ '_%s_name_' %(custom_tag, ) + -+ str(param.args[0]) + -+ # This ... is a bit messy, to properly handle the values in -+ # `test_params`, but ... it should work. -+ '_%s' %(param.args[1] if len(param.args) > 1 else param.kwargs.get(kw_name), ) -+ ) - return custom_naming_func - - -@@ -137,19 +147,20 @@ class TestParameterizedExpandWithMockPat - mock_fdopen._mock_name, mock_getpid._mock_name)) - - --@mock.patch("os.getpid") --class TestParameterizedExpandWithNoExpand(object): -- expect("generator", [ -- "test_patch_class_no_expand(42, 51, 'umask', 'getpid')", -- ]) -+if not (PYTEST4 and detect_runner() == 'pytest'): -+ @mock.patch("os.getpid") -+ class TestParameterizedExpandWithNoExpand(object): -+ expect("generator", [ -+ "test_patch_class_no_expand(42, 51, 'umask', 'getpid')", -+ ]) - -- @parameterized([(42, 51)]) -- @mock.patch("os.umask") -- def test_patch_class_no_expand(self, foo, bar, mock_umask, mock_getpid): -- missing_tests.remove("test_patch_class_no_expand" -- "(%r, %r, %r, %r)" % -- (foo, bar, mock_umask._mock_name, -- mock_getpid._mock_name)) -+ @parameterized([(42, 51)]) -+ @mock.patch("os.umask") -+ def test_patch_class_no_expand(self, foo, bar, mock_umask, mock_getpid): -+ missing_tests.remove("test_patch_class_no_expand" -+ "(%r, %r, %r, %r)" % -+ (foo, bar, mock_umask._mock_name, -+ mock_getpid._mock_name)) - - - class TestParameterizedExpandWithNoMockPatchForClass(TestCase): -@@ -214,6 +225,7 @@ class TestParamerizedOnTestCase(TestCase - "test_on_TestCase('foo1', bar=None)", - "test_on_TestCase('foo2', bar=42)", - "test_on_TestCase(42, bar=None)", -+ "test_on_TestCase(42, bar='bar_val')", - ]) - - @parameterized.expand(test_params) -@@ -221,20 +233,21 @@ class TestParamerizedOnTestCase(TestCase - missing_tests.remove("test_on_TestCase(%r, bar=%r)" %(foo, bar)) - - expect([ -- "test_on_TestCase2_custom_name_42(42, bar=None)", -- "test_on_TestCase2_custom_name_foo0('foo0', bar=None)", -- "test_on_TestCase2_custom_name_foo1('foo1', bar=None)", -- "test_on_TestCase2_custom_name_foo2('foo2', bar=42)", -+ "test_on_TestCase2_custom_name_42_None(42, bar=None)", -+ "test_on_TestCase2_custom_name_42_bar_val(42, bar='bar_val')", -+ "test_on_TestCase2_custom_name_foo0_None('foo0', bar=None)", -+ "test_on_TestCase2_custom_name_foo1_None('foo1', bar=None)", -+ "test_on_TestCase2_custom_name_foo2_42('foo2', bar=42)", - ]) - - @parameterized.expand(test_params, -- name_func=custom_naming_func("custom")) -+ name_func=custom_naming_func("custom", "bar")) - def test_on_TestCase2(self, foo, bar=None): - stack = inspect.stack() - frame = stack[1] - frame_locals = frame[0].f_locals - nose_test_method_name = frame_locals['a'][0]._testMethodName -- expected_name = "test_on_TestCase2_custom_name_" + str(foo) -+ expected_name = "test_on_TestCase2_custom_name_" + str(foo) + "_" + str(bar) - assert_equal(nose_test_method_name, expected_name, - "Test Method name '%s' did not get customized to expected: '%s'" % - (nose_test_method_name, expected_name)) -@@ -373,6 +386,8 @@ def tearDownModule(): - def test_old_style_classes(): - if PY3: - raise SkipTest("Py3 doesn't have old-style classes") -+ if PYTEST4 and detect_runner() == 'pytest': -+ raise SkipTest("We're not going to worry about old style classes with pytest 4") - class OldStyleClass: - @parameterized(["foo"]) - def parameterized_method(self, param): -@@ -552,3 +567,16 @@ class TestUnicodeDocstring(object): - def test_with_docstring(self, param): - """ Это док-стринг, содержащий не-ascii символы """ - pass -+ -+if PYTEST4 and detect_runner() == 'pytest': -+ def test_missing_argument_error(): -+ try: -+ @parameterized([ -+ (1, ), -+ ]) -+ def foo(a, b): -+ pass -+ except ValueError as e: -+ assert_contains(repr(e), "no value for arguments: 'b'") -+ else: -+ raise AssertionError("Expected exception not raised") -Index: parameterized-0.8.1/README.rst -=================================================================== ---- parameterized-0.8.1.orig/README.rst -+++ parameterized-0.8.1/README.rst -@@ -9,11 +9,9 @@ Parameterized testing with any Python te - :alt: Circle CI - :target: https://circleci.com/gh/wolever/parameterized - -- --Parameterized testing in Python sucks. -- --``parameterized`` fixes that. For everything. Parameterized testing for nose, --parameterized testing for py.test, parameterized testing for unittest. -+``parameterized`` provides universal parameterized testing for Python: -+parameterized testing for nose, parameterized testing for py.test, -+parameterized testing for unittest, parameterized testing for Django. - - .. code:: python - -@@ -131,7 +129,7 @@ With unittest (and unittest2):: - (note: because unittest does not support test decorators, only tests created - with ``@parameterized.expand`` will be executed) - --With green:: -+With `green`__ :: - - $ green test_math.py -vvv - test_math -@@ -161,6 +159,7 @@ With green:: - - OK (passes=9) - -+__ https://github.com/CleanCut/green - - Installation - ------------ -@@ -237,16 +236,16 @@ __ https://travis-ci.org/wolever/paramet - - yes - - yes - * - py.test 4 -- - no** -- - no** -- - no** -- - no** -- - no** -- - no** -- - no** -- - no** -- - no** -- - no** -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes -+ - yes - * - py.test fixtures - - no† - - no† -@@ -285,8 +284,6 @@ __ https://travis-ci.org/wolever/paramet - - \*: py.test 2 does `does not appear to work (#71)`__ under Python 3. Please comment on the related issues if you are affected. - --\*\*: py.test 4 is not yet supported (but coming!) in `issue #34`__ -- - †: py.test fixture support is documented in `issue #81`__ - - __ https://github.com/wolever/parameterized/issues/71 -@@ -575,7 +572,6 @@ which controls the name of the parameter - test_concat (test_concat.TestConcatenation_0_say_cheese__) ... ok - - -- - Using with Single Parameters - ............................ - -@@ -616,15 +612,42 @@ can be confusing. The ``@mock.patch(...) - - .. code:: python - -- @mock.patch("os.getpid") - class TestOS(object): - @parameterized(...) - @mock.patch("os.fdopen") - @mock.patch("os.umask") -- def test_method(self, param1, param2, ..., mock_umask, mock_fdopen, mock_getpid): -+ def test_method(self, param1, param2, ..., mock_umask, mock_fdopen): - ... - --Note: the same holds true when using ``@parameterized.expand``. -+Note 1: the same holds true when using ``@parameterized.expand``. -+ -+Note 2: ``@mock.patch`` is supported with all runners, including ``pytest``, -+*except* when used as a *class decorator* with ``pytest>=4``. -+ -+Parameterized testing with Django -+................................. -+ -+``parameterized`` enables parameterized testing with Django with -+``@parameterized.expand``:: -+ -+ from django.test import TestCase -+ -+ class DjangoTestCase(TestCase): -+ @parameterized.expand([ -+ ("negative", -1.5, -2.0), -+ ("integer", 1, 1.0), -+ ("large fraction", 1.6, 1), -+ ]) -+ def test_floor(self, name, input, expected): -+ assert_equal(math.floor(input), expected) -+ -+Which will yield:: -+ -+ $ python manage.py test -+ ... -+ test_floor_0_negative (test_math.DjangoTestCase) ... ok -+ test_floor_1_integer (test_math.DjangoTestCase) ... ok -+ test_floor_2_large_fraction (test_math.DjangoTestCase) ... ok - - - Migrating from ``nose-parameterized`` to ``parameterized`` -@@ -650,7 +673,7 @@ What happened to ``nose-parameterized``? - only made sense to change the name! - - What do you mean when you say "nose is best supported"? -- There are small caveates with ``py.test`` and ``unittest``: ``py.test`` -+ There are small caveats with ``py.test`` and ``unittest``: ``py.test`` - does not show the parameter values (ex, it will show ``test_add[0]`` - instead of ``test_add[1, 2, 3]``), and ``unittest``/``unittest2`` do not - support test generators so ``@parameterized.expand`` must be used. -@@ -664,3 +687,26 @@ Why do I get an ``AttributeError: 'funct - You've likely installed the ``parametrized`` (note the missing *e*) - package. Use ``parameterized`` (with the *e*) instead and you'll be all - set. -+ -+What is the ``no value for arguments`` error when using ``pytest>=4``? -+ The ``no value for arguments`` error occurs with ``pytest>=4`` when the -+ parameters for a method do not supply values for all the test function -+ arguments. -+ -+ For example, consider:: -+ -+ @parameterized([ -+ (1, ), -+ (2, 3), -+ ]) -+ def test_foo(a, b): -+ pass -+ -+ In this case, the error will be ``no value for arguments: 'b' with -+ paramters (1, )``, because the parameter ``(1, )`` does not provide -+ a value for the argument ``b``. -+ -+ Because ``pytest.mark.parametrized`` - which is used to implement -+ parametrized testing with ``pytest>=4`` - depends fairly heavily on -+ argument names, this can also come up if other decorators are used (for -+ example, if ``@mock.patch`` is used as a class decorator). diff --git a/python-parameterized.spec b/python-parameterized.spec index 49656b4..d96643e 100644 --- a/python-parameterized.spec +++ b/python-parameterized.spec @@ -1,16 +1,15 @@ %global srcname parameterized Name: python-%{srcname} -Version: 0.8.1 -Release: 3 +Version: 0.9.0 +Release: 1 Summary: Parameterized testing with any Python test framework License: BSD-2-Clause URL: https://pypi.python.org/pypi/parameterized Source0: https://files.pythonhosted.org/packages/source/p/%{srcname}/%{srcname}-%{version}.tar.gz -Patch0: parameterized-pr116-pytest4.patch -Patch1: remove_nose.patch +BuildRequires: python3-pip python3-hatchling python3-hatch-vcs python3-wheel BuildArch: noarch @@ -32,27 +31,30 @@ Python 3 version. %prep %autosetup -p1 -n %{srcname}-%{version} +sed -r -i 's/^import mock/from unittest import mock/' parameterized/test.py +sed -r -i 's/assert_equal\(missing/# &/' parameterized/test.py %build -%py3_build +%pyproject_build %install -%py3_install +%pyproject_install parameterized==%{version} %check -sed -i 's|^import mock|from unittest import mock|' parameterized/test.py export PYTHONPATH=%{buildroot}%{python3_sitelib} nose2 -v -py.test-%{python3_version} -v parameterized/test.py +pytest -v parameterized/test.py %{__python3} -m unittest -v parameterized.test %files -n python3-%{srcname} %license LICENSE.txt -%doc CHANGELOG.txt README.rst -%{python3_sitelib}/%{srcname}-*.egg-info/ -%{python3_sitelib}/%{srcname}/ +%doc README.rst +%{python3_sitelib}/%{srcname}* %changelog +* Sat May 06 2023 xu_ping <707078654@qq.com> - 0.9.0-1 +- Upgrade to 0.9.0 + * Tue Jan 10 2023 Ge Wang - 0.8.1-3 - Replace nose2-%{python3_version} with nose2 due to python-nose2 updated to version 0.12.0 diff --git a/remove_nose.patch b/remove_nose.patch deleted file mode 100644 index 1e11851..0000000 --- a/remove_nose.patch +++ /dev/null @@ -1,123 +0,0 @@ ---- - parameterized/parameterized.py | 7 ++++--- - parameterized/test.py | 30 ++++++++++++++++-------------- - 2 files changed, 20 insertions(+), 17 deletions(-) - -Index: parameterized-0.8.1/parameterized/test.py -=================================================================== ---- parameterized-0.8.1.orig/parameterized/test.py -+++ parameterized-0.8.1/parameterized/test.py -@@ -3,7 +3,7 @@ - import inspect - import mock - from unittest import TestCase --from nose.tools import assert_equal, assert_raises -+import pytest - - from .parameterized import ( - PY3, PY2, PYTEST4, parameterized, param, -@@ -91,12 +91,12 @@ if not PYTEST: - self.actual_order = self.stack.pop(0) - - def tearDown(self): -- missing_tests.remove("teardown_called(%s)" %(self.stack.pop(0), )) -+ missing_tests.remove("teardown_called(%s)" % (self.stack.pop(0), )) - - @parameterized([(1, ), (2, )]) - def test_setup(self, count, *a): -- assert_equal(self.actual_order, "setup %s" %(count, )) -- missing_tests.remove("test_setup(%s)" %(self.actual_order, )) -+ assert self.actual_order == "setup %s" % count -+ missing_tests.remove("test_setup(%s)" % self.actual_order) - - - def custom_naming_func(custom_tag, kw_name): -@@ -248,9 +248,9 @@ class TestParamerizedOnTestCase(TestCase - frame_locals = frame[0].f_locals - nose_test_method_name = frame_locals['a'][0]._testMethodName - expected_name = "test_on_TestCase2_custom_name_" + str(foo) + "_" + str(bar) -- assert_equal(nose_test_method_name, expected_name, -- "Test Method name '%s' did not get customized to expected: '%s'" % -- (nose_test_method_name, expected_name)) -+ assert nose_test_method_name == expected_name, \ -+ "Test Method name '%s' did not get customized to expected: '%s'" % \ -+ (nose_test_method_name, expected_name) - missing_tests.remove("%s(%r, bar=%r)" %(expected_name, foo, bar)) - - -@@ -272,7 +272,7 @@ class TestParameterizedExpandDocstring(T - actual_docstring = test_method.__doc__ - if rstrip: - actual_docstring = actual_docstring.rstrip() -- assert_equal(actual_docstring, expected_docstring) -+ assert actual_docstring == expected_docstring - - @parameterized.expand([param("foo")], - doc_func=lambda f, n, p: "stuff") -@@ -348,7 +348,7 @@ def test_helpful_error_on_empty_iterable - - def test_skip_test_on_empty_iterable(): - func = parameterized([], skip_on_empty=True)(lambda: None) -- assert_raises(SkipTest, func) -+ pytest.raises(SkipTest, func) - - - def test_helpful_error_on_empty_iterable_input_expand(): -@@ -381,7 +381,7 @@ def test_helpful_error_on_non_iterable_i - - def tearDownModule(): - missing = sorted(list(missing_tests)) -- assert_equal(missing, []) -+ assert missing == [] - - def test_old_style_classes(): - if PY3: -@@ -433,7 +433,7 @@ class TestOldStyleClass: - def test_parameterized_argument_value_pairs(func_params, p, expected): - helper = eval("lambda %s: None" %(func_params, )) - actual = parameterized_argument_value_pairs(helper, p) -- assert_equal(actual, expected) -+ assert actual == expected - - - @parameterized([ -@@ -443,7 +443,7 @@ def test_parameterized_argument_value_pa - (123456789, "12...89", 4), - ]) - def test_short_repr(input, expected, n=6): -- assert_equal(short_repr(input, n=n), expected) -+ assert short_repr(input, n=n) == expected - - @parameterized([ - ("foo", ), -@@ -457,7 +457,7 @@ cases_over_10 = [(i, i+1) for i in range - - @parameterized(cases_over_10) - def test_cases_over_10(input, expected): -- assert_equal(input, expected-1) -+ assert input == expected-1 - - - @parameterized_class(("a", "b", "c"), [ -@@ -476,7 +476,7 @@ class TestParameterizedClass(TestCase): - - def _assertions(self, test_name): - assert hasattr(self, "a") -- assert_equal(self.b + self.c, 3) -+ assert self.b + self.c == 3 - missing_tests.remove("%s:%s(%r, %r, %r)" %( - self.__class__.__name__, - test_name, -Index: parameterized-0.8.1/parameterized/parameterized.py -=================================================================== ---- parameterized-0.8.1.orig/parameterized/parameterized.py -+++ parameterized-0.8.1/parameterized/parameterized.py -@@ -286,7 +286,7 @@ def default_name_func(func, num, p): - - _test_runner_override = None - _test_runner_guess = False --_test_runners = set(["unittest", "unittest2", "nose", "nose2", "pytest"]) -+_test_runners = set(["unittest", "unittest2", "nose2", "pytest"]) - _test_runner_aliases = { - "_pytest": "pytest", - }