From a30e4b848cc1dfa3d865c554b8decc509ab065f4 Mon Sep 17 00:00:00 2001 From: Neo Date: Sun, 26 Oct 2025 13:38:31 +0200 Subject: [PATCH 1/2] updated and checking --- __pycache__/utils.cpython-313.pyc | Bin 0 -> 4458 bytes app.py | 8 +-- tests/__pycache__/test.cpython-313.pyc | Bin 0 -> 8356 bytes tests/test.py | 8 +-- utils.py | 95 ++++++++++++++++--------- 5 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 __pycache__/utils.cpython-313.pyc create mode 100644 tests/__pycache__/test.cpython-313.pyc diff --git a/__pycache__/utils.cpython-313.pyc b/__pycache__/utils.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a63de1e5eb98718d29a508e4d6e15ae8fb51971f GIT binary patch literal 4458 zcmbtXU2GHC6~6OlPaHcA*eQYCB?B>FLw=wnY!b*;VV7M95NL(~RkDmG_Ba`EY;$K! z$nrv8s_;+|geY09ROJ!gcB@M5OQmM}&{y2-Zs>?gmD(5H0s*n*q3StzW*j?>=yvx; zIWu$aopaBe^WAekuSOyv0^|MQzbF476Y>vy@Q3K#tbPbL_lQbV?j#xHD5sF^_{5*& z2L&o9q?zm_s<4fyVmI%;Lq(>OKo_X!q={fkeu@iHoFksq?Mb|zGA%ppzU4~6dsrQY zn|ox8P);S3S2-%EJQY=eN@{~Djs?1S6*jmmUgl^}4QwM+R)ZkxR2gJQtpi!FhCqhZ zdXNz{OdBR5si+frU(cmWIo&SMr**K&C%*~}7fShznV(R`jY<8QS)hHPcI8A?p`KpL zm=mULDgFJ*{x-$T+s1@J+jHg>L!pLM%E6R1St#W)U;s3BiRO)rqFcDM15BNE7@E@x7`h3sa;sVS4W6qG@UT>!E+$(1(?MMBZdE~2@vsyR)~?;&ZPL5y^FGiZ4#G2o9BXUuD+g-NWgIlgjltt&sMZZc3&@QkE*_oM~fe&7{K_n1X3 z!`850c(vNuRu!jpa|l`s&#YS!4}Ern6-1WJ6vvML5M0q~Xjo8P^ZJwl)itDPQ-w?^ zhxcJkyIRt7-b_@}vL?0coS8TB1(*(MTBeZJG-ixd4B80h*vX)Xak>iy9xl2MMJEWS zNz*JF(wx?G+otAt$u=xad+6efeJ2gzViZ^=tsW4+AkTPFl2<}xOY_Y$&qPi-u%Nyq zaCsgGNr#?q12y6$Jnmzk%S@%gN@e&(;7tsms{dp6XKVnv|78(afIL<=7Qp%s z3;|dG=t7JK)T{M0JP}SsoZxX_9R)h`^Z=~-Xyh}N0!?07n^lt2rah_TjcLqD3R}Eu zs2w>2Y;Pn}O8a|C4z?WyLm&5f%)w$RrI3Yd-msJ;@CcX(dSazIkd>erB~vi0{2m)N zg!h#KRZL4Uri%7Vn`cHD{TQi7I%nuK30~r)3FgpC*Aa&}GTs$|i`BGY#2sc~6%lif zTx`t2)g2RliFNAyS2gcc&?B&<`baRqIgMVhD|Db2mtil40=sp`FB=#PoX}e2YJ5SY zF<%Ij{~DGWBqEt|LuT z(>9y{ln-haJvKoHa6Ol;ZB8N{0VnLI6rWhu$6ztkGC4eZ?)IfymzLzWm*v*7+`25M z%5v)S#2@32@b1GWkxg@n`yF>W7Fs_K{w31$`+>*d$nB4AeKa??9N$%r?^=rQd5|c_ zJH85cz7j}7?{cK)n@G=V3n|Z{&^pj5EOv$l`h(ytquFVQQ)M8i7*_8ftnyASW;6`SnN}5fZSg0{?kF`v%lqfOQ@<4GcLP zrN`haDE=Izhfy2{QHw4HM~j|>38#)4dWKanM`FODr*XZ=Iw&2&B_d8c5?f^9fd$U$ zk=CGBBb}&^HBW)Cw0;f(;1-R|eQG56&+&?VdY#fAr4iLj0Si-Cy+29(xqOzySF7 zXnZ#Oujc}3y2vrbSCJm3du=7ai$xMU8W$F0TaHEpiyciMzZ7`Td>NHc#zRM2gEbhf z)U!c&`+sB9$J6i|FpBjdB|?U#*D?gB7_;D>dMTYNSOyRZq#PEU4dO)^CZIbw5kJQ4 z5z}hD1)}Oe&#MpKEz1X&<=(Q~`?Y-7ZQbv|qM=lTVjHDDMsW~D7YYQfySo6{ce%$I z)M1|K&rn=KaR|k`D3Hp!6aza1MS+Gb#2Qiz2`EOGY>M4HvBCqHScts bool: while True: user_input = input("\033[36m> \033[0m") parts = user_input.split(" ") - #prints history : last 5 expressions with the last expression being first if (user_input.strip().lower() == "h"): print("--------History---------\n") h = history.restore() @@ -90,9 +89,4 @@ def is_valid_expression(exp: str) -> bool: history.save(f"{user_input.strip()} = {ans}") - print("=",ans,end="\n\n") - - - - - \ No newline at end of file + print("=",ans,end="\n\n") \ No newline at end of file diff --git a/tests/__pycache__/test.cpython-313.pyc b/tests/__pycache__/test.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec05ec1d438fe15ce7075d5584f87f078523f0ba GIT binary patch literal 8356 zcmeHMYit|G5xygN%kc{pV4al)wPS*oD4GUM%6lg} z_K(15(84Yn$U)#nN*{LH6tVvVM1S!|PzWs$6a`v~X2WT1>fzTgKB)b9HBJRxI zgAW~L2O#>R$O0Vh?#<5b&CWM7ySM1|x;Q9#$CqcX)^OY>*wBlhRTi&8OW6;Xj_h1j#{bJk9}6C+o;XYt>)HpqOF+|g;U%xldcO?|9h?KKeaPXJ8(Ll!0Cwc z0Wy!nh623eI2@DYB)tq(*MV?+bTS@>=BO%FrM%Wy?1Rcp?i7d1r52H=R?*VTQJZK5 zD&R7yT@-*iL|6zVq64T?BtTuFle(j>fLp0K5s~D=O!E#9I;u~BGvOQIZ*dUFP41-e zOyqmD`Un>{dW)W0ik@3wFe_0mU>%~^oJSI{QXBj!!YI7#v+7^>U0$(Ck@&cTQvJ%- z(LJX|qzIK5JvDJzKATKz#Q~~zPRZ~J5~H0HmlZ*Z$RiUSYXKUMdW1f%1u*k+?|&0ulQYL8aWGKgp`ka+3Wx0<(obUGOQ&)v`e^vyF9{n7od z{4XY;Cty?DVF}V_8e08z0-!4GnZ7XcFjmKgFVYs!#P z@)QS1zXNiWyGJ~EvN}UnPdDCbo@vheHfMaB?+o0zko9$?x^kq~oZ(=qH|yJ--ku{t zbB5GSthE|vqw62M`qMvb0;iB{cy;#oZO$OYh@|?0!Kt9; z3qI~wM+Bz;;?xHmDzx3wn=@!rOy zW7gL<>zE^lzXmz%XmJr8MQMit_bPzq|1OL(kk6x!i~jb}##2+ju>_+mod41tjP|hN z4>EjHgpHcYj$)0WSdI9f_ebA7^zoI(cNaAja{(RKALu=erMRv+KN*)}6Y9Iw$>9s1z6$)9u=%}JxQpgDk8G9Ah z>n=zuWb9Rt>n+l6QFZ`Pymn|FW48)$Op|E~kk~&VUeDtpREyBISvA}W3h`d=?Q7K&SRc->rVqPOC`W=$@sS1Ij$zn139u|2_6~4aH>A* z>q(u+kv--NVyZ3c+n$P;LB4nj)4ZH9h^h9hZ%5i@7P3nu%#q#8MC7;NT`L`|Pa4N+ z{W8JAF(bhZD=Wi}vJPk#AGg_64qWFHz!BxzxGmg9ZP*wb?8hyBt`%nRgEj28wsPY< zURSW>4_5+*EsuKG8V<*#h@{kiJ3^C#+O{90G)Y;OMz;d(Abcr@Eyv^ z)358KaZ^{=dKm3369~&&cZ3EK`> zlXMP<$#K3X1ODQ8j_h3GFG`<0lOfMckKH;qb1vVqE7P*;z4jdGV`Ew~r1iG#9oNrX zdHMCvF$Nat+G-v3hz^Uul*ew7=k?cylwTvY6VxW6| zC?L>7FcCeBV3Dd#krG$Fhu32!W-iu=-1Ss6LKZQc)JnKHQa-K~~ zwTPFh3<2YSH5R9!qr40wM_DO+qhL{_>?t-)M;Tu(DvmO_+3(e)Cjg&jxI1aYuo2_S zN#Smt&190mjPRljCmS}fq)h{V`iy09*IbJ5L@7lP7c9X(bj8{2-|X-9@Aq%N;_UHn z^7lY>cOlNrqvH$M=`r|&4>sY85ye5lktJz_1wh3bk0ju84EW)RyB3P!RuRydOA;Et z->=?At632a4}}wBAx(nPRt!@H{c@He5F&jC2#aM?p6hTu?aL6~^yVB{5Amq1=Pz}Q zZ+c$$I6DjKYbQRwEw4AwACSguw^_-!S*GB{?%DJ9QGT~)pSwUS+Su`Oh5%E~2M%lf~CW6;?wyPwS&(wrk}mf6kerrVY| z(!R`|ybY5Sf64^Fnz-Wvtjs>R>Dpr&H*u`PCK}bpFpZl4+Dzm8rGQJN`+K+@~b%XGnM}lFR0<1kiZCh1;u6aj z)GyEk^>QE#s>RJ@bCgZ4kbP>V+DFd<3wl2Z^Xbp5JkNi~)qco1KjM6U list[str]: returns list of lines (as strings). If file doesn't exist or is empty, return []. + - clear(): empties the file. + """ filepath_ = "" - def __init__(self, filepath): + def __init__(self, filepath: str): self.filepath_ = filepath - - def save(self,expression:str): - pass - def restore(self)->list[str]: - pass + + def save(self, expression: str): + Path(self.filepath_).parent.mkdir(parents=True, exist_ok=True) + with open(self.filepath_, "a", encoding="utf-8") as f: + f.write(expression.rstrip() + "\n") + + def restore(self) -> List[str]: + if not Path(self.filepath_).exists(): + return [] + with open(self.filepath_, "r", encoding="utf-8") as f: + lines = [line.rstrip("\n") for line in f.readlines() if line.strip() != ""] + return lines + def clear(self): - pass \ No newline at end of file + open(self.filepath_, "w", encoding="utf-8").close() From b14dd7c29833ae5adf2efa9aa41415df85b92dc9 Mon Sep 17 00:00:00 2001 From: neo25-rgb Date: Mon, 27 Oct 2025 15:09:47 +0200 Subject: [PATCH 2/2] Remove error symbols from validation messages --- app.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index dfbfc0a..70ef6be 100644 --- a/app.py +++ b/app.py @@ -8,7 +8,7 @@ def is_valid_expression(exp: str) -> bool: # Expression must have exactly 3 parts: number, operator, number if len(parts) != 3: - print("❌ Expression must have exactly 3 parts: e.g., '2 + 3'") + print("Expression must have exactly 3 parts: e.g., '2 + 3'") return False a_str, operator, b_str = parts @@ -18,13 +18,13 @@ def is_valid_expression(exp: str) -> bool: float(a_str) float(b_str) except ValueError: - print("❌ Both operands must be valid numbers (int or float).") + print("Both operands must be valid numbers (int or float).") return False # Validate operator valid_ops = {"+", "-", "*", "/", "x", "X"} if operator not in valid_ops: - print(f"❌ Invalid operator '{operator}'. Must be one of {', '.join(valid_ops)}.") + print(f" Invalid operator '{operator}'. Must be one of {', '.join(valid_ops)}.") return False # If all checks pass @@ -89,4 +89,4 @@ def is_valid_expression(exp: str) -> bool: history.save(f"{user_input.strip()} = {ans}") - print("=",ans,end="\n\n") \ No newline at end of file + print("=",ans,end="\n\n")