From 7979ad7d0b889f6771ef386b0edff8192ef5ebe4 Mon Sep 17 00:00:00 2001 From: Tusa05 Date: Wed, 1 Oct 2025 21:48:58 +0300 Subject: [PATCH] lesson4 --- .../__pycache__/string_utils.cpython-313.pyc | Bin 0 -> 2861 bytes ..._string_utils.cpython-313-pytest-8.4.2.pyc | Bin 0 -> 11981 bytes 04_lesson/string_utils.py | 53 +++++++++++ 04_lesson/test_string_utils.py | 84 ++++++++++++++++++ pytest.ini | 4 + 5 files changed, 141 insertions(+) create mode 100644 04_lesson/__pycache__/string_utils.cpython-313.pyc create mode 100644 04_lesson/__pycache__/test_string_utils.cpython-313-pytest-8.4.2.pyc create mode 100644 04_lesson/string_utils.py create mode 100644 04_lesson/test_string_utils.py create mode 100644 pytest.ini diff --git a/04_lesson/__pycache__/string_utils.cpython-313.pyc b/04_lesson/__pycache__/string_utils.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..207b1dfd4a8634a0a075fac5c45797377398f4fc GIT binary patch literal 2861 zcmc&$OKcNI7@qa|mCeJh6Gsr#W^qwvH-SC~suUHZ0?nZOq?wdu{IF_=KYwZ~oMkZ7e!NIh|Ln@Ci>wBJ9r$r=&Ft*c}n|NQg+ zGxL4(jW;?w6^3uuvEL_N_A~Yeb(){M(b(95#thrRA}r4OSX?^bs*iAX+7*-2O@FGr zjn2jd8Z&H^aVgHYD=u+4?&9vaJnD(NM?FLCxTlYO>gHaD#Vag6Vett+|ByHC7uGh1 z)dOpruqttdx1Vm0b=d9k0?*`5CkmOY@km1MVitvBesA70%hpBfqKZHBfw_Wy#k^xK zTi49{W>vK=TbIl#j8)WSVKNuZd)9RouD7fUu-!6OFt!9|`YW5u_=i7&lo8ar1g8~q zNwK|#Sc2{4dZEa3>Bb?61EIEz|BVQW8J3VfqBTDC9cc9Tu$WZ*4IRb&0l}-tSjEc9 zX2rUsQhL=~u)aXjMHLIHm`k*ZK^5z+&~EE)4^Ulz-(~At6&tyX4WOgas?A@8+X6zZ zn0FQ0)dE^~;DG&FR~sR$Zx9_@SIygI#gVDGs{52-SWTu=QyCn4=5sw7G0sd+@q8qv z?meVN;`L5aiAlC1yi(*9bJ=b~&yI5swrJ4FsH*+Wk>SyVp>so&qet`Sa@l-p%osHa z#j)wpH;1&WZW#F-`h>GqB%t?AO>>Zz*}V?*_ibe&G8)||F0fh$3-+!BR4bsa1|p_E zvH>$|!HDn?7?seN0nKx+XXBJ`9cZ8zr6BlHF-Dlu?5Dmh-<U;1-Ob)Nb!PkE>oDWJGefXKdVo1eLQnMCi6DzMc{5L=O!`*-Iz+H zb%V|gK{-j0?WQDl(1|Enx-e!OMgc4p*1NN$tatUSb@f|a{d3A%*MQYEupZvE7LHos z=zQO5c&Ic|lUX3_a9Qmdco+zmI(Y}>@fy>Ur}Ejf6EsphL4o6F2nxurY;#$+fQ`F` zuP~OA6Y?Imn|(rr7N3u$5Km?Oj7G-ULAjreOEI~40_;)D@1Akxk{|P;o^;@`r7uEk zFa?(!Sl%YR0?>eM3C8ccb@LeW809M>{(l!DX0%lzs zRsevStluu0(vo>wNo>p#Cn*v=Z$))66I@c?BH_sA3aL!ah>}u#2-z5fX4JJqoI?xy z)VH^pk*Lq8?^PLj^e;ZJ(38oH>E~_bcq&`e-{(BfW9}{b@g6{A%N&|QnA6_t?DIDl zW%oE4*tF71XuO94EbL){o|0U1$!#yKhj!c?yfHX?b~W_ce8>t7l#bN=EZALA{@(Pl zVBZFl;M5U(7zmY=nh%|S3?ku`o<8=y5|w|JqVn^Im|)L(FHVG-5AhQn3T>}LThBHr zkx&*2s+d2vO2q!*7&E)}JWd zFYFk8Ao(>dmzvZy%~mvRGCx+#QoBRbJ}aiOjgf$+jc2$~$YyeSE{|cKrj6y(Xvh!- z@zioK3>tkZpU;Xt@_y=vH4UO)$fUJY0b+fs2xZqaz8hmgY{lK;q^zO?DF;sK=H>s-i1U=oeMvbAGKO(B~(M{^r_O!zb zCRAmFK~?R3OjSKQB|a9zPf%Jw>!NJ`yY<63#OZX!$^vNAWJ!`9yN0CRzZeP;=RcQh B0RR91 literal 0 HcmV?d00001 diff --git a/04_lesson/__pycache__/test_string_utils.cpython-313-pytest-8.4.2.pyc b/04_lesson/__pycache__/test_string_utils.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..397a6dd7bfdcf9a9af4b370af12ea1b5686f7a93 GIT binary patch literal 11981 zcmeHN&u<&Y6`uXUCB>y=*|HQla@#FiH)d+flt{^QAIGncK|B%YH;Za-xmDmjgdSYBRE3WGxgq+9GmK8-FLCb1W3Ot3~8fZ6cq1&hb!W zy+!2SHjz&@=LG!D-J!@mEh3+86ZvFwPMD|6-Yc?yg`I8@`AnP0C!h0~(46~PMDA-7 z`Gj+Zvwb!cxxYo^vnx_+;GcNo%%>z*H*2(1S;^N*WoM(WRH?4j3Qmn)GOW8*YpG@} zr<9cJYR-r2RcgDM$@W{atBj0hXcU~J zyTd^w1Pu!O@5|7BOm3r%Z42R1p3P1sNuG>JT(vWK>DmoK?3s&R|C`eCEkbTXedF7L zsCmKw`y|x8yqc9v`PN8Q9`nYU%5BVqZ40c13XSiB>h~HLmcP*yCDA+^`fUkv3})8ysJtv;iY1=R4bNC8&>?@ zMI4t&IjQ(PW0D_rHRZSoxR2r1F0A3b?RNS1wi^@o_EyAIs_SWNMzP6YGltF8=RHNo zv1pCukOOaE%x%SKH_Y9Q2hrX5balOEIkiHOx~B_E#d5hottwrzSF1&8xe4el+*vD? zYo&_gYGoTnIPPG<`M_Q)FSDVAm9l-OST0nGtCrhUaEk9+=)vuIon=t6E3=f^)a@(0 zZ`0LctpMqli>QB*;l#nSk3+Zx^HU) z8gzgszlRHt)ZAv^5Jn4)jXvlbMsE-L9$<7x^UY7x+&;{Lq!d^Z)OovN(aWHMLg*E= z%g+@!oiq({XCXMefCdYqC>WiE04^PWJFqYxWg+uR`ir~}Py``#5St`4;W|Vy@6VT$ zinRg-5X#9YbmQVfU&ZFT&>&)?5!6_Ns3;|`^~28SpforOxQW}#zbHB=jV!drbRCq| zHBWW8W&ot!JRV2`{I%K+o-rg9fEU^e5h!46LXor(NJ~W*6dwvH6gxuCWAim^zK#t% znGkAV^G$48*N!s`ilCzagj|K;=&KoooNwso>uRR1pMUV)j{XXW4<{OWW>@w8cChai zU**DMHG?3;8`20g=m1ZC4;LP(nFsIrHW)25Hu|7%82xY}JUXQL<|k^#t9$eko`qp( zQu0RB;18>;3Uta}#5G(z z3jgLG1&@uI86DO*V`aw7uDs^)SJ7keS5YxTvG*#60{qo1@KNI3ya0uq`P6~^^!X%tyF%AS1sKtg^hi_JJT6VFeD=&KPR z%v`m)K9Ux&Dz@asKPt4^igBnmjX{xYqTj-xA;xJetXvI~Ot~hKX~e;T=aEbXf4Ups zWRaIsfYRn+BvL2NKcMlcBBP-jb##PnGpO{kjL`j!|~6!Q9;ld)4Y;WqKV=@@Pf?W+}afYu~}QuA`Ywo$S;} zLXPlO`%5CvJ9YA~IvGOIi^oIJ%U0Q{Sp|-Zj{&9WG?WewV_!#U7MnR}1U~L=@_bZ~ z+^)da=zx54O;#?4REneBn_2%#~52cv_(Pi}-qhcw>|F2y?< zg}o|euSuB%m7T-hdH(8DaV3N1@t64-G@Y{EDeIlG4mSdPY!!U?^dgfZ^j*An;S064 z@V8Z6^f7P&4*U@wj1P6ZX7sx;@g)s=5#*jL@NaL1IoScw7U_p>Onji?>hR$Xe2N1vj5he!DsIfrY7~>fmq!%wIYokkB3h?d z#wq5!#gpa4M(p~ky}VYozDIu!UHB!R(*s}n?J1HZ{f&^{kY9IyO1}L}BfUevyLUga zrx7{!+o4|#?MnR(ssE`I<;q|~8myli{x?xa str: + """ + Принимает на вход текст, делает первую букву заглавной + и возвращает этот же текст + Пример: `capitilize("skypro") -> "Skypro"` + """ + return string.capitalize() + + def trim(self, string: str) -> str: + """ + Принимает на вход текст и удаляет пробелы в начале, если они есть + Пример: `trim(" skypro") -> "skypro"` + """ + whitespace = " " + while string.startswith(whitespace): + string = string.removeprefix(whitespace) + return string + + def contains(self, string: str, symbol: str) -> bool: + """ + Возвращает `True`, если строка содержит искомый символ + и `False` - если нет + Параметры: + `string` - строка для обработки + `symbol` - искомый символ + Пример 1: `contains("SkyPro", "S") -> True` + Пример 2: `contains("SkyPro", "U") -> False` + """ + res = False + try: + res = string.index(symbol) > -1 + except ValueError: + pass + + return res + + def delete_symbol(self, string: str, symbol: str) -> str: + """ + Удаляет все подстроки из переданной строки + Параметры: + `string` - строка для обработки + `symbol` - искомый символ для удаления + Пример 1: `delete_symbol("SkyPro", "k") -> "SyPro"` + Пример 2: `delete_symbol("SkyPro", "Pro") -> "Sky"` + """ + if self.contains(string, symbol): + string = string.replace(symbol, "") + return string diff --git a/04_lesson/test_string_utils.py b/04_lesson/test_string_utils.py new file mode 100644 index 0000000..0691ea8 --- /dev/null +++ b/04_lesson/test_string_utils.py @@ -0,0 +1,84 @@ +import pytest +from string_utils import StringUtils + + +string_utils = StringUtils() + + +@pytest.mark.positive +@pytest.mark.parametrize("input_str, expected", [ + ("skypro", "Skypro"), + ("123", "123"), + ("04 апреля 2023", "04 апреля 2023"), +]) +def test_capitalize_positive(input_str, expected): + assert string_utils.capitalize(input_str) == expected + + +@pytest.mark.negative +@pytest.mark.parametrize("input_str, expected", [ + ("None", "None"), + ("", ""), + (" ", " "), +]) +def test_capitalize_negative(input_str, expected): + assert string_utils.capitalize(input_str) == expected + + +@pytest.mark.positive +@pytest.mark.parametrize("input_str, expected", [ + ("Skypro", "Skypro"), + ("123", "123"), + (" 04 апреля 2023", "04 апреля 2023"), +]) +def test_trim_positive(input_str, expected): + assert string_utils.trim(input_str) == expected + + +@pytest.mark.negative +@pytest.mark.parametrize("input_str, expected", [ + ("None", "None"), + ("", ""), + (" Skypro", "Skypro"), +]) +def test_trim_negative(input_str, expected): + assert string_utils.trim(input_str) == expected + + +@pytest.mark.positive +@pytest.mark.parametrize("input_str, symbol, expected", [ + ("Skypro", "S", True), + ("123", "1", True), + ("04 апреля 2023", "04", True), +]) +def test_contains_positive(input_str, symbol, expected): + assert string_utils.contains(input_str, symbol) == expected + + +@pytest.mark.negative +@pytest.mark.parametrize("input_str, symbol, expected", [ + ("", "F", False), + (" ", "L", False), +]) +def test_contains_negative(input_str, symbol, expected): + assert string_utils.contains(input_str, symbol) == expected + + +@pytest.mark.positive +@pytest.mark.parametrize("input_str, symbol, expected", [ + ("Skypro", "S", "kypro"), + ("123", "1", "23"), + ("04 апреля 2023", "0", "4 апреля 223"), +]) +def test_delete_symbol_positive(input_str, symbol, expected): + assert string_utils.delete_symbol(input_str, symbol) == expected + + +@pytest.mark.negative +@pytest.mark.parametrize("input_str, symbol, expected", [ + ("None", "", "None"), + ("", "N", ""), + (" ", "0"," "), +]) +def test_delete_symbol_negative(input_str, symbol, expected): + assert string_utils.delete_symbol(input_str, symbol) == expected diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..75ea0cd --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +markers = + positive: Тесты, которые проверяют корректное поведение функции + negative: Тесты, которые проверяют некорректное поведение функции \ No newline at end of file