From ede9d4f2146add58a0f51a63c67a138c6c6d6753 Mon Sep 17 00:00:00 2001 From: Edvard Rejthar Date: Thu, 24 Oct 2024 19:48:00 +0200 Subject: [PATCH] docs --- asset/choice_enum_instance.avif | Bin 0 -> 1603 bytes asset/complex_example.avif | Bin 0 -> 5690 bytes asset/complex_example_missing_field.avif | Bin 0 -> 2774 bytes asset/list_of_paths.avif | Bin 2023 -> 2061 bytes asset/tag_choices.avif | Bin 0 -> 1367 bytes docs/index.md | 10 +++++++- mininterface/mininterface.py | 29 +++++++++++++++++------ mininterface/tag.py | 24 +++++++++++++------ mininterface/tk_interface/utils.py | 6 ++--- mininterface/types.py | 6 ++++- pyproject.toml | 2 +- tests/tests.py | 15 ++++++++++-- 12 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 asset/choice_enum_instance.avif create mode 100644 asset/complex_example.avif create mode 100644 asset/complex_example_missing_field.avif create mode 100644 asset/tag_choices.avif diff --git a/asset/choice_enum_instance.avif b/asset/choice_enum_instance.avif new file mode 100644 index 0000000000000000000000000000000000000000..46046c1b685f09694fd11e7c789c6b19eb24c45b GIT binary patch literal 1603 zcmYjN3pmqj82@jEO>0R+GLxbUvb7~m%H@>kjC2*IW-R~O+M10mk=fZeks+j$Yr4Ch zA~n=Hrea;rNm3!5uCu~iPog^it*7Ul?|I(u_rCA%_q~@70027%PspLgfeZjTI%I(i z0t=)uDBc7g0Dv81Me}Gn4mwL>qL|$8E&y;qI`4qHf2HnmelTFt} zKLG$7&}ATls{z0u42ty;tR4a)%Vx6m1N_H8w2tv+ za$;yYr8UTn{$2q9Ff_h^sqd-l+5&R890-d*4xJ65IT*`{hER91AZvomlmiMtUBUo~ zL_&b3#Swf(09u!tLuWI&2k1-zR1w-E8A?HmewV}kC$`av-J#aLI)~3aKxT2G_v$Yn zG99FI$g#p$UNkF~3~4|nNaG60v>)T!f*h8959le>1ObDK5da(kGn5(w03x3iMdO(P zCPr4+*Mm>DtvCla&4M8|_c{r>m+sk)E9rdrx#V=R{EKfaZlG4aW@+)}%u&a0kIWJr zG^gtG$b#&Obc{4YCRr7-hxnSRyvmsJ7@#<0fqT4a3JgRF!_;g1g1yV^% zS##Ja_@_oqK4IxvK+4VU*+xkXF+5W3ivQrVJr##4>d;ctOtGtv2QR?wGD{Ntv!Jg% zp^O~179(ODZDg_AE6saWCjE}4dF>lCRX71nA35^j~J@ z<%LgP(QfqfU3k|wMEEW*C2l!Yh{1h($?R=VCK8c5CJhTeTigxA&C9+u!E*_XEUCe2 zVrIX1$Elo+d>CXJoqVeB8g>{JnW(7!IC%?+uaNU4W&?efhExB@UfXVk$i)n%jR#GO zT@%U2NaJ6O5{f3>Z6))AZTQqjSdF8(u{#|tOAAg)pVdD?&`Nt+F4ifx6x2*F{HI}) zzm1!CW8P6lRY1a7Ze$*a<;Ht1bQcdUblY{JVmCI;F-d-8vkRJ6P{8 z5zxA}`?^%GDC^y4Q?GOZx92OgM#tMeJ-busP;ey;k6uTyFn%A`!I#0Q0`E*}^T@hl zhCE^pql=lgj&Q z?q+wqo1&hXK?QQ0)vgKsQ}I_x>47nk?+q39{mjga6ynRqH7dChX1Y?&pZQ>D|KCUC z=6%D2N|WJ|&_m9jiw7_74=k@nqZR!Vqu;XYRMf^@F4gNl)(V@K90}X4iHM4ySdj0& zaq0P21-BJrJO!lpsGXW3N}Zid4DP%gfUUKi^z7sbH%gkqe@%XI!)ZRa^U_~irV*-D4ce7K$}x}4kCmmIm?t>V?YX#;VUfJpj7ZEJDG2F&>^Yp> z`P}J3RJWtD_0oNT-7`z+2F>t7)={^aC!ZXSX%pYvcX_Sao6;vvwk3^~6~7G{ncJ;V z)vM3FF!V{NO_wqv4>!v1t?E{%?2u%L W%QeihlvHVqLN-=f_%O@uu-CtV4U$Iy literal 0 HcmV?d00001 diff --git a/asset/complex_example.avif b/asset/complex_example.avif new file mode 100644 index 0000000000000000000000000000000000000000..81787093503ccb728475cb5338cb16c2bde89cdc GIT binary patch literal 5690 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 K{}knWm-b(BlEtV1 literal 0 HcmV?d00001 diff --git a/asset/list_of_paths.avif b/asset/list_of_paths.avif index 573151294aedb8cc966059683e99c09e0875b191..df99f7ab40aa0c4aaf02b3f57d852048d7cd12f7 100644 GIT binary patch delta 1496 zcmV;}1tyOY5Ig?}UqUj)%S0)yIx<&F={Xq$eN18}$W!)_1|pQN;%(b2yg zst|ZXgEl)%xaP74<53IX*rEK0rKF|SKapTWB=a^+$pY#Tq(q5I04j2IE?2H3Go0O; z77sjAz}|uL(yxKi=eVHmX_oU?MCa^zB-;wUUujq1sxhE~#fPp?_ein|+6uBiKJDG( zSVUV~qfaMz`Q^7cTPsGwbn>+!sk6#Gky%GJnWl^akYp^yGFVT-6ckd~uTdkKY6b#o zRwXS-iYUZQ`=TntKIrtg)P_|#_vO4bm->ApC}~Nbgp2{>@VD2wyk3s!_^+lgPrq|5blS6OOfih~juWiFA8Or71!7<ik;hqipi%_7tUYZL+N3DFF3;xB&5N(RQMOA1gbD4U$%7sZ-i~j$8<|dN-_G zaTW;ap6}Gp*zkY5dw*)+w5OXXUmyCp@C^xeBzoR3pTY7k&)dYYQ3KtpZ{D6;_7%=9 zF)UsT48qqM*PEugeX5~7@ruD{ZYb9orn1D?n1KLiuee1*$+Z!J%zfd~QbfWqT|?oW z<>MlI|6OBamq%4PB=M^C&rDon;=I?=fm+&PhH|6u1=D{HxxO_AYDWJk_;2{xQ(u2m z9hIDC&o$k$FMx2V=|aEKbZ{yd=|S+NLt&urYlpaX^64 zKUH@DNF8OI=`Icf-!(I;d&+gEGmyFtzKI%_5Y14XexTBJkLyUzTwanVuwXW_j*Cxq z>}q>4*ykJGHE9mfVwUTdc13qg*3HePiY$A)tT%r{%wjTH?8Cz>fA)r9X>^Iw(mk|! z6!psFnf0)h#OEQD2w8;UTUB&#CT$2#Z25$oblxg}F(dzs2EW3Wg|$2R0S@~47N4F_sF2MY>LN=vUn8f6KcHpo?;7 zjL&~g*GrU#3$RQq0MB~vgJ)!M7+nMfPE4zYmikql4Q0TWVfMG`liFyDXH^%)!qVSD zmfIrAshdv{F+=&elWhlK`Hv%h6=&G~f3U>0n9cyFh~+Ho`V&4?Ry+zCW$MX=Re%Qs z>==DpAJuZ!Y9+jjyY88svHd*o&gSE6OVw2-on~{~(_6!PylA z_jM!~<4|Mo1+qq6S_}q^^I3 z4DFf2AlJD}{Pd1UZHUn0Tp!J^4SsEVYVPQ-Plk53PatA&OeAfX=ex0K4?T}=81L#wQ+UB9{eF{>IE#lNOp(htgBI|x y$P%ly^X5^pz-S90%{mWTHw$s$^KB%2jKz{yorXho_}JoQtc?Y3XmC#?Tj-GKR^HnH delta 1458 zcmV;j1x@;m5a$n&dK3c&000Ex00IC2009610kr@C0a1~Tdj%%|006I(4gsPOI&EZO zbP@mx1{fja)yyg~#FN1Rg?|>rd^^aQ2hikd$1ViR`=UFIiuM2f zgi#;dIwa^Qu&wBoDqsA9=AS7cLu_Seeu=oj&U#v;;jJ*#w-u;=?0A#pr}L5MYK;wP!B2 z<(>qeYiu*vocN8@@xZg&mT$}y{hRlL3V=dyK0Qza6yTF%@PmduVGLyZi!HiOV`G}5Fj8JKr+yi4Ff%YpIatrI@Jk*1w}=ZNLgmgwNlJYCybu>LE1fb z@<3<`Im^Tn4NWFW2ZAvse z->kx+5JGQfum-xZWnU!1(P88f3Aze~;o^SChUC8ey!o5PgexWR%sPpOYWt0UkZ|&< zi5Q&Gj+Nhj|cxaxZcQl2yNHmw`mO?u&G~WNU*mb9FGQ(gY9|B z0H2eK>qgH{nT1!y`P*@h)9Ft|3sexzNk%Z-ed_&J6gsyGYAt{gk}{g3zWrD zjh42KGT~@SPyi=;5@5_0bQ}|t3bA=b#GLIz@XBT+gBV+WLWoL#J-Y;e?*FjAFR#w} z1qu=V@s36A%2DOKQj4MA;`mXc#-zGQW$`rILPqZgU}lcVuY0prJ&l{D zYiFZ&q)_DCS?Afl@8uVBtj?uw`%{pR&k}u|{-X;)+bw_mqe+Y1c`3PoZjt}#p?4-3 zFF2=P^j>y9xh-ISKENyQ{Ge32anbt$SX3X)2_%vr%q|-r;w1r~l8WmFl`4xlW;x~= zYNVpahXv=x>k8iS220nXX!PCd9xPTg@0VhMf|1CDST~-T*RKX_9U z+p;6O#MXM9#rbRC2Z{ay>RsZF8XB(4|3_om=|RLDld_mN9beY^Q~EJ0OB|KVHNxU- MA82-H94d0$Yc0uY^>nP!-qnV9D5Xz0Yiz}TCcT9OEo0|JeVl$;_6lYyZi zGr0uD2GKd0Nibvh3NlM_!E%g1QYSMfKN-YxVPIfl0EqxG({&(j0P?{+#;rg~3CMQJ z%*+G31S}&3fOI6585la}=j4MOfRF)7gJc|Y3NjKwDy1@uQXwWVFz_XoR^))~ z1lf8xv!JK|NYBkINX`e+BALYnsX!V8ih+0!5DOG!R%C(%m^nB&fD}(+nW1wd0}n_@ zI5|J3C@(pu0%#)89}PeuphqFf8IcsrfD~H*t#$@6N{jNWatl(^!Gx1la%OUYRdHo; zNosDf6;MrPPG(|JrBx!#`Er>BxnO?)wE`_+VPtA%VPIlmWNl*yI%-vJN@9r+0~ecw zd*D~zTx2~1#Q3An3Waa%JXRDS-|^S|aVYS{JHxmf<~hFvzA^8)%ltNp(uRIU1I z_SUIZ6%$u?^R>nGx0**J7(b3ZvMuem^;=j#MCo(5_y43=Y(ln>^N=|o+u{JcFN*vuSuGUQmABl+ws(;wR`L@{e1H*T>T>JI+gvxD5XS&*aKz#MLn{tLH zUKk(0x@gm8zwaiEg|n;-g6@0ro0?eLEnCHE>EiFTHpJXjQ(_|9mq)wR_t-tyw=1)` zX1V1%3E9xc4%Ox>_d0OiQeANPtCUikjQ0K|pEPuQ#FDR^J+kb-)XL`zZl*f2Y}E9V z;Pdgz-}b9g=IEA+Pq+3gNnP)kSj_5lRQ#otw-PywH)NEQ+{|Wt{zxb(}=%oD{Hy-5{ z-}B(Y`dLTXk|pE&IlPv{dcNk~_x+{*lS`tSE)8$m8=R7y%l{q!^ZEU{;2pbu{L9mA z%+mF>` bool: # other interfaces does not guarantee that. Hence, we need to do the type conversion too. if self.annotation: if self.annotation == TagCallback: - return True # TODO + return True # NOTE, EXPERIMENTAL if ui_value == "" and NoneType in get_args(self.annotation): # The user is not able to set the value to None, they left it empty. # Cast back to None as None is one of the allowed types. diff --git a/mininterface/tk_interface/utils.py b/mininterface/tk_interface/utils.py index de5128a..3a73a11 100644 --- a/mininterface/tk_interface/utils.py +++ b/mininterface/tk_interface/utils.py @@ -114,16 +114,16 @@ def _fetch(variable): widget['values'] = list(tag._get_choices()) widget.pack() widget.bind('', lambda _: "break") # override default enter that submits the form - variable.set(chosen_val) + if chosen_val is not None: + variable.set(chosen_val) else: for i, (choice_label, choice_val) in enumerate(tag._get_choices().items()): widget2 = Radiobutton(nested_frame, text=choice_label, variable=variable, value=choice_label) widget2.grid(row=i, column=1, sticky="w") subwidgets.append(widget2) - if choice_val is chosen_val: + if choice_val is tag.val: variable.set(choice_label) - # TODO does this works in textual too? # File dialog elif path_tag := tag._morph(PathTag, (PosixPath, Path)): diff --git a/mininterface/types.py b/mininterface/types.py index 85de0e8..16adb14 100644 --- a/mininterface/types.py +++ b/mininterface/types.py @@ -7,7 +7,8 @@ from .tag import Tag, ValidationResult, TagValue -from .type_stubs import TagCallback, TagType # Allow import from the module +from .type_stubs import TagCallback, TagType # Allow import from the module + def Validation(check: Callable[["Tag"], ValidationResult | tuple[ValidationResult, TagValue]]): """ Alias to [`Tag(validation=...)`][mininterface.Tag.validation] @@ -37,6 +38,9 @@ def Choices(*choices: list[str]): class CallbackTag(Tag): ''' Callback function is guaranteed to receives the [Tag][mininterface.Tag] as a parameter. + !!! warning + Experimental. May change. + For the following examples, we will use these custom callback functions: ```python from mininterface import run diff --git a/pyproject.toml b/pyproject.toml index def4ce0..18215e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "mininterface" -version = "0.6.2rc2" +version = "0.6.2" description = "A minimal access to GUI, TUI, CLI and config" authors = ["Edvard Rejthar "] license = "GPL-3.0-or-later" diff --git a/tests/tests.py b/tests/tests.py index d1202f1..37dd32d 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -204,11 +204,12 @@ def test_choice_callback(self): self.assertEqual(50, m.choice(choices, default=callback_raw)) - # TODO This test does not work + # TODO This test does not work. We have to formalize the callback. # self.assertEqual(100, m.choice(choices, default=choices["My choice2"])) class TestConversion(TestAbstract): + def test_tagdict_resolve(self): self.assertEqual({"one": 1}, formdict_resolve({"one": 1})) self.assertEqual({"one": 1}, formdict_resolve({"one": Tag(1)})) @@ -421,7 +422,6 @@ def test_tag_src_update(self): self.assertEqual("moo", m.env.test) def test_nested_tag(self): - # TODO docs nested tags t0 = Tag(5) t1 = Tag(t0, name="Used name") t2 = Tag(t1, name="Another name") @@ -448,6 +448,12 @@ def test_nested_tag(self): self.assertEqual(5, t4.val) self.assertEqual(8, t5.val) # from t2, we iherited the hook to t1 + # update triggers the value propagation + inner = Tag(2) + outer = Tag(Tag(Tag(inner))) + outer.update(3) + self.assertEqual(3, inner.val) + class TestRun(TestAbstract): def test_run_ask_empty(self): @@ -788,6 +794,11 @@ def test_choice_method(self): # list of enums self.assertEqual(ColorEnum.GREEN, m.choice([ColorEnum.BLUE, ColorEnum.GREEN], default=ColorEnum.GREEN)) self.assertEqual(ColorEnum.BLUE, m.choice([ColorEnum.BLUE])) + # this works but I'm not sure whether it is good to guarantee None + self.assertEqual(None, m.choice([ColorEnum.RED, ColorEnum.GREEN])) + + # Enum instance signify the default + self.assertEqual(ColorEnum.RED, m.choice(ColorEnum.RED)) if __name__ == '__main__':