From 64639d22f60b19640f812877e9d26ee5f2bf1229 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sun, 5 May 2024 14:29:47 +0300 Subject: [PATCH] rebase 0.4 and create 0.5 --- .../__pycache__}/add_func.cpython-311.pyc | Bin 438 -> 429 bytes .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2145 bytes .../__pycache__}/dbtable.cpython-311.pyc | Bin 8268 -> 8259 bytes .../project_config.cpython-311.pyc | Bin 1379 -> 1370 bytes 0.4_stable/__pycache__/texts.cpython-311.pyc | Bin 0 -> 1336 bytes add_func.py => 0.4_stable/add_func.py | 0 config.yaml => 0.4_stable/config.yaml | 0 dbconnection.py => 0.4_stable/dbconnection.py | 0 dbtable.py => 0.4_stable/dbtable.py | 0 main.py => 0.4_stable/main.py | 0 .../project_config.py | 0 .../__pycache__/cath_table.cpython-311.pyc | Bin 2445 -> 2436 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 7042 -> 7033 bytes {tables => 0.4_stable/tables}/cath_table.py | 0 {tables => 0.4_stable/tables}/dish_table.py | 0 .../tables/people_table.py | 0 .../tables/phones_table.py | 0 texts.py => 0.4_stable/texts.py | 0 0.5_test/add_func.py | 5 + 0.5_test/config.yaml | 6 + {default_project => 0.5_test}/dbconnection.py | 0 0.5_test/dbtable.py | 113 +++++++++ 0.5_test/main.py | 221 ++++++++++++++++++ .../project_config.py | 0 .../__pycache__/cath_table.cpython-311.pyc | Bin 0 -> 2436 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 7033 bytes 0.5_test/tables/cath_table.py | 43 ++++ 0.5_test/tables/dish_table.py | 102 ++++++++ {tables => 0.5_test/tables}/people_table.py | 0 {tables => 0.5_test/tables}/phones_table.py | 0 0.5_test/texts.py | 20 ++ __pycache__/dbconnection.cpython-311.pyc | Bin 2154 -> 0 bytes BDLab2-6.pdf => other/BDLab2-6.pdf | Bin .../default_project}/config.yaml | 0 other/default_project/dbconnection.py | 34 +++ .../default_project}/dbtable.py | 0 .../default_project}/main.py | 0 other/default_project/project_config.py | 21 ++ other/default_project/tables/people_table.py | 23 ++ other/default_project/tables/phones_table.py | 27 +++ test.py => other/test.py | 0 test.sql => other/test.sql | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 4088 -> 4079 bytes .../__pycache__/_json.cpython-311.pyc | Bin 7973 -> 7964 bytes .../__pycache__/_range.cpython-311.pyc | Bin 22675 -> 22666 bytes .../__pycache__/errors.cpython-311.pyc | Bin 569 -> 560 bytes .../__pycache__/extensions.cpython-311.pyc | Bin 9203 -> 9194 bytes .../yaml/__pycache__/__init__.cpython-311.pyc | Bin 17224 -> 17215 bytes .../yaml/__pycache__/composer.cpython-311.pyc | Bin 7063 -> 7054 bytes .../__pycache__/constructor.cpython-311.pyc | Bin 38654 -> 38645 bytes .../yaml/__pycache__/cyaml.cpython-311.pyc | Bin 5398 -> 5389 bytes .../yaml/__pycache__/dumper.cpython-311.pyc | Bin 2865 -> 2856 bytes .../yaml/__pycache__/emitter.cpython-311.pyc | Bin 53391 -> 53382 bytes .../yaml/__pycache__/error.cpython-311.pyc | Bin 4257 -> 4248 bytes .../yaml/__pycache__/events.cpython-311.pyc | Bin 5856 -> 5847 bytes .../yaml/__pycache__/loader.cpython-311.pyc | Bin 4252 -> 4243 bytes .../yaml/__pycache__/nodes.cpython-311.pyc | Bin 2528 -> 2519 bytes .../yaml/__pycache__/parser.cpython-311.pyc | Bin 25759 -> 25750 bytes .../yaml/__pycache__/reader.cpython-311.pyc | Bin 8931 -> 8922 bytes .../__pycache__/representer.cpython-311.pyc | Bin 18361 -> 18352 bytes .../yaml/__pycache__/resolver.cpython-311.pyc | Bin 9901 -> 9892 bytes .../yaml/__pycache__/scanner.cpython-311.pyc | Bin 57115 -> 57106 bytes .../__pycache__/serializer.cpython-311.pyc | Bin 6714 -> 6705 bytes .../yaml/__pycache__/tokens.cpython-311.pyc | Bin 7251 -> 7242 bytes 64 files changed, 615 insertions(+) rename {__pycache__ => 0.4_stable/__pycache__}/add_func.cpython-311.pyc (62%) create mode 100644 0.4_stable/__pycache__/dbconnection.cpython-311.pyc rename {__pycache__ => 0.4_stable/__pycache__}/dbtable.cpython-311.pyc (96%) rename {__pycache__ => 0.4_stable/__pycache__}/project_config.cpython-311.pyc (70%) create mode 100644 0.4_stable/__pycache__/texts.cpython-311.pyc rename add_func.py => 0.4_stable/add_func.py (100%) rename config.yaml => 0.4_stable/config.yaml (100%) rename dbconnection.py => 0.4_stable/dbconnection.py (100%) rename dbtable.py => 0.4_stable/dbtable.py (100%) rename main.py => 0.4_stable/main.py (100%) rename {default_project => 0.4_stable}/project_config.py (100%) rename {tables => 0.4_stable/tables}/__pycache__/cath_table.cpython-311.pyc (94%) rename {tables => 0.4_stable/tables}/__pycache__/dish_table.cpython-311.pyc (97%) rename {tables => 0.4_stable/tables}/cath_table.py (100%) rename {tables => 0.4_stable/tables}/dish_table.py (100%) rename {default_project => 0.4_stable}/tables/people_table.py (100%) rename {default_project => 0.4_stable}/tables/phones_table.py (100%) rename texts.py => 0.4_stable/texts.py (100%) create mode 100644 0.5_test/add_func.py create mode 100644 0.5_test/config.yaml rename {default_project => 0.5_test}/dbconnection.py (100%) create mode 100644 0.5_test/dbtable.py create mode 100644 0.5_test/main.py rename project_config.py => 0.5_test/project_config.py (100%) create mode 100644 0.5_test/tables/__pycache__/cath_table.cpython-311.pyc create mode 100644 0.5_test/tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 0.5_test/tables/cath_table.py create mode 100644 0.5_test/tables/dish_table.py rename {tables => 0.5_test/tables}/people_table.py (100%) rename {tables => 0.5_test/tables}/phones_table.py (100%) create mode 100644 0.5_test/texts.py delete mode 100644 __pycache__/dbconnection.cpython-311.pyc rename BDLab2-6.pdf => other/BDLab2-6.pdf (100%) rename {default_project => other/default_project}/config.yaml (100%) create mode 100644 other/default_project/dbconnection.py rename {default_project => other/default_project}/dbtable.py (100%) rename {default_project => other/default_project}/main.py (100%) create mode 100644 other/default_project/project_config.py create mode 100644 other/default_project/tables/people_table.py create mode 100644 other/default_project/tables/phones_table.py rename test.py => other/test.py (100%) rename test.sql => other/test.sql (100%) diff --git a/__pycache__/add_func.cpython-311.pyc b/0.4_stable/__pycache__/add_func.cpython-311.pyc similarity index 62% rename from __pycache__/add_func.cpython-311.pyc rename to 0.4_stable/__pycache__/add_func.cpython-311.pyc index a1da1c94a0a8123a8f7b94a47389dc34f2d822dc..ed8982db6a7bf2010f6e3b4d201782ae2fd98b8b 100644 GIT binary patch delta 36 qcmdnSyq1}JIWI340}zB|nNQ??#v|im6%&%0n4A&g5k8rXaRUIR{|V&) delta 44 ycmZ3>yp5TAIWI340}$Bw>rdoesi?Xh zV6hLn2l~k~AbV&77hr6)4Wu|MlRG{U$U8hPxM(2n@VLNGc>{Te#|0+~49Dx(SbYwM zP{Hr;8>l;)?g+ZQc03*713*9Q_COpg4M8S^q%7J#EnCd2>9$xlb!wCKjA{N-qM9wP zmP|_yP?i$PVxVj>4FIwGw5*lM8u~ibbNPF=uRW4=^S)YIU-`uLtF8RnB4cF17ERsA z**=)%@+&4wj3m95Wlt-*`RgB-jZ8MStYzB^;b11$@7qLC^2NNRD3uG{XEy1G zSzPANK(2bA1`z6VQA?U3z`@9+uuKE1jGmaa*+ z78kzbHkJM^&kT>Us9vyRm%Xhk?o-RuEK%F9-_zByrLz}eZ7pxvB&S>IYQ`{R55NAl z2P|zL)y=YDnd~$rsa*{sgRTsoDg`ErfRXtR5U7LD&`$noD0&=<)dr1w$p z!`^Cmsz#>kWV%YGUD0PX604I~mBd_8tVX8lWU5N08YH+AcuIzk$#9K~)X7MdjJReK zH6quETqSa2FuXVV`{-}c-RQQ@)qhwc<8?A#CF5^}8HoIPcQ^2OY&W=%j|ax80rJ=0yDcd%^4CHUb7xO2BvfIiD`;Rf>K(^ek zDF(c;CUQwc@WPYe64K+n(nM!T3!MSOgB5h}=@rJYw}d->O}=Oa`z5^!GIsXnO(5{@ cVBGW}Jh0WzzNUB)gO{`9C6m2+i-P<351w?T!~g&Q literal 0 HcmV?d00001 diff --git a/__pycache__/dbtable.cpython-311.pyc b/0.4_stable/__pycache__/dbtable.cpython-311.pyc similarity index 96% rename from __pycache__/dbtable.cpython-311.pyc rename to 0.4_stable/__pycache__/dbtable.cpython-311.pyc index 0c7c812aa1f4db0de302864be906a8a64d74188b..e9fc9a2582db92d095b9338580ca6b4a72ed6145 100644 GIT binary patch delta 38 scmX@(aM*!+IWI340}zB|nQ!D4X5^7}v5E;vO-#;+@d)2+%qS@j0KcpWtpET3 delta 47 zcmX@?aK?dqIWI340}$98(cj1|%qXgoVigmTnwXps;}IU?l30@Hlvtd)S&LCp9soH} B4PO8N diff --git a/__pycache__/project_config.cpython-311.pyc b/0.4_stable/__pycache__/project_config.cpython-311.pyc similarity index 70% rename from __pycache__/project_config.cpython-311.pyc rename to 0.4_stable/__pycache__/project_config.cpython-311.pyc index bf4398ffc87b27c2ebaa497673e1598c23dff495..cb30855d5f5bc7b7c90bddb47c80f6b1d5af2f79 100644 GIT binary patch delta 38 scmaFNb&HF8IWI340}zB~nQ!F2&BUYRVigmTnwXps;}O33H&X@^0LuvrI{*Lx delta 47 zcmcb`^_Yu$IWI340}yl@sBPrF%_ORwVigmTnwXps;}IU?l30@Hlvtd)`4dwH697N~ B4xRu2 diff --git a/0.4_stable/__pycache__/texts.cpython-311.pyc b/0.4_stable/__pycache__/texts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f006ee2e439436a06732725974fbdb509d4750ba GIT binary patch literal 1336 zcmc&!&ubGw7~Rbe+b%SRKwFBJ@mMj%R&8k_o;-N+q9BCG61yoWHf?EkvEGtaMNle2 z(Tn0yyd~Q#O>C3=10KG)_Nf0rptqiU-|V*9O+^rj!|v?NeDBRS^WMyU9v(I{l+5GV z1vjQ?Ke%&T^q_G#ipG1*(z2SRXLT!*jaboa)Qa8HCgRRF1nHBkP?KD_DK}(QZg7h{ z+85*s+DEG`x2~WgUs0Vr#scFBY9Q3|37~svLj+|?qy%*V?8qu6=wRB4ps!S89_?U& z^R+T3glP}}t@{)~O+3^_o)`GmXb<%+*yzbOg5J{hFX|lU!qVh(>QE!&d^q0F@3}E| z7u+hZ;f#e`GQK~1H$)$iYL{HpNKKxRI*;Nkz?k!xIAzc_Yb9S}`E1Nf-h_ZEU1ge* zkD6(rRKKcZLl7H=>TpK6y#uXlkf4nSxPke;+Si!UK%lN5dwekb6pVK9w)(Yg`rPYm z@Fv)7<_Rx+A_DLYPSkgN>e$*AHPkZyKsS?YgPTHPNO^t3sBl7wXlZq&?Q zjlvZauu%z0HQ%DyGc5{%LJHrVh#e%$#g!*!DZjXEmI}*`X|LM{2{ksKw~OXfs6Wm9 z5f!%<%S973g~RX{?U4UjN8`8Cx%-9ud@*eHjao23=YSt{IG v8v>GlaplXXdQn~1dy(kqMbeVJK|Q&uR}#Go@#GjjiTL;!X(Rr#HURif0K#8I literal 0 HcmV?d00001 diff --git a/add_func.py b/0.4_stable/add_func.py similarity index 100% rename from add_func.py rename to 0.4_stable/add_func.py diff --git a/config.yaml b/0.4_stable/config.yaml similarity index 100% rename from config.yaml rename to 0.4_stable/config.yaml diff --git a/dbconnection.py b/0.4_stable/dbconnection.py similarity index 100% rename from dbconnection.py rename to 0.4_stable/dbconnection.py diff --git a/dbtable.py b/0.4_stable/dbtable.py similarity index 100% rename from dbtable.py rename to 0.4_stable/dbtable.py diff --git a/main.py b/0.4_stable/main.py similarity index 100% rename from main.py rename to 0.4_stable/main.py diff --git a/default_project/project_config.py b/0.4_stable/project_config.py similarity index 100% rename from default_project/project_config.py rename to 0.4_stable/project_config.py diff --git a/tables/__pycache__/cath_table.cpython-311.pyc b/0.4_stable/tables/__pycache__/cath_table.cpython-311.pyc similarity index 94% rename from tables/__pycache__/cath_table.cpython-311.pyc rename to 0.4_stable/tables/__pycache__/cath_table.cpython-311.pyc index 2ab3c77e1dd8a3b7785d650fa279eaca5e16ffb5..25e31db8fa7f42788386813723586934332849cb 100644 GIT binary patch delta 38 scmeAbZV~2Q&dbZi00iM#<{P?iJ=<&dbZi00e(*^fz+zFpBD>SjB{-CMIXZc!bBeB$gyPB^IY{R%T4(000|l B4D0{^ diff --git a/tables/__pycache__/dish_table.cpython-311.pyc b/0.4_stable/tables/__pycache__/dish_table.cpython-311.pyc similarity index 97% rename from tables/__pycache__/dish_table.cpython-311.pyc rename to 0.4_stable/tables/__pycache__/dish_table.cpython-311.pyc index 147aaaf458955d7a9009bc07d12fc860b19253a0..3af5eecb0c682bc3ae31ddd8757462e978301e48 100644 GIT binary patch delta 38 scmZoN|7pg(oR^o20SLmg%r|nYGxDgqSjB{-CMIXZc!Y0uXS9|A0K9(*)&Kwi delta 47 zcmexq)@07ToR^o20SLr83^sDBGm7e^SjB{-CMIXZc!bBeB$gyPB^IY{wqvxG0stxy B4JH5p diff --git a/tables/cath_table.py b/0.4_stable/tables/cath_table.py similarity index 100% rename from tables/cath_table.py rename to 0.4_stable/tables/cath_table.py diff --git a/tables/dish_table.py b/0.4_stable/tables/dish_table.py similarity index 100% rename from tables/dish_table.py rename to 0.4_stable/tables/dish_table.py diff --git a/default_project/tables/people_table.py b/0.4_stable/tables/people_table.py similarity index 100% rename from default_project/tables/people_table.py rename to 0.4_stable/tables/people_table.py diff --git a/default_project/tables/phones_table.py b/0.4_stable/tables/phones_table.py similarity index 100% rename from default_project/tables/phones_table.py rename to 0.4_stable/tables/phones_table.py diff --git a/texts.py b/0.4_stable/texts.py similarity index 100% rename from texts.py rename to 0.4_stable/texts.py diff --git a/0.5_test/add_func.py b/0.5_test/add_func.py new file mode 100644 index 0000000..163c1fc --- /dev/null +++ b/0.5_test/add_func.py @@ -0,0 +1,5 @@ +import re + +def is_cyr_or_dig(string): + pattern = r'^[\u0400-\u04FF\d]+$' + return bool(re.match(pattern, string)) \ No newline at end of file diff --git a/0.5_test/config.yaml b/0.5_test/config.yaml new file mode 100644 index 0000000..26dda36 --- /dev/null +++ b/0.5_test/config.yaml @@ -0,0 +1,6 @@ +# Базовые параметры настройки конфигурации проекта +dbname: DBProd # В классе менять не надо +user: postgres # Замените на свой логин от БД в классе +password: Qwerty # Замените на свой пароль от БД в классе +host: localhost # Замените на 192.168.0.48 в классе +dbtableprefix: "public." # Замените на свой логин от БД \ No newline at end of file diff --git a/default_project/dbconnection.py b/0.5_test/dbconnection.py similarity index 100% rename from default_project/dbconnection.py rename to 0.5_test/dbconnection.py diff --git a/0.5_test/dbtable.py b/0.5_test/dbtable.py new file mode 100644 index 0000000..7888a05 --- /dev/null +++ b/0.5_test/dbtable.py @@ -0,0 +1,113 @@ +# Базовые действия с таблицами + +from dbconnection import * + +class DbTable: + dbconn = None + + def __init__(self): + return + + def table_name(self): + return self.dbconn.prefix + "table" + + def columns(self): + return {"test": ["integer", "PRIMARY KEY"]} + + def column_names(self): + return sorted(self.columns().keys(), key = lambda x: x) + + def primary_key(self): + return ['id'] + + def column_names_without_id(self): + res = sorted(self.columns().keys(), key = lambda x: x) + if 'id' in res: + res.remove('id') + return res + + def table_constraints(self): + return [] + + def create(self): + sql = "CREATE TABLE " + self.table_name() + "(" + arr = [k + " " + " ".join(v) for k, v in sorted(self.columns().items(), key = lambda x: x[0])] + sql += ", ".join(arr + self.table_constraints()) + sql += ")" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + return + + def drop(self): + sql = "DROP TABLE IF EXISTS " + self.table_name() + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + return + + def insert_one(self, vals): + for i in range(0, len(vals)): + if type(vals[i]) == str: + vals[i] = "'" + vals[i] + "'" + else: + vals[i] = str(vals[i]) + sql = "INSERT INTO " + self.table_name() + "(" + sql += ", ".join(self.column_names_without_id()) + ") VALUES(" + sql += ", ".join(vals) + ")" + cur = self.dbconn.conn.cursor() + # cur.execute(sql) + try: + cur.execute(sql) + self.dbconn.conn.commit() + except psycopg2.errors.UniqueViolation: + self.dbconn.conn.rollback() + return + + def first(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchone() + + def last(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join([x + " DESC" for x in self.primary_key()]) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchone() + + def all(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchall() + + def select_one(self, **kwargs): + conditions = [] + values = [] + + sorted_kwargs = sorted(kwargs.items(), key=lambda x: x[0]) + + for key, value in sorted_kwargs(): + conditions.append(f"{key}=%s") + values.append(value) + + sql = f"SELECT * FROM {self.table_name()} WHERE " + " AND ".join(conditions) + cur = self.dbconn.conn.cursor() + cur.execute(sql, tuple(values)) + result = cur.fetchone() + cur.close() + + if result: + return True + else: + return False + + + diff --git a/0.5_test/main.py b/0.5_test/main.py new file mode 100644 index 0000000..7d0b05f --- /dev/null +++ b/0.5_test/main.py @@ -0,0 +1,221 @@ +import add_func +import sys +import texts +sys.path.append('tables') + +from project_config import * +from dbconnection import * + +from tables.dish_table import * +from tables.cath_table import * + +class Main: + + config = ProjectConfig() + connection = DbConnection(config) + + def __init__(self): + DbTable.dbconn = self.connection + return + + def db_init(self): + cth = CathTable() + d = DishTable() + cth.create() + d.create() + return + + def db_insert_somethings(self): + cth = CathTable() + dsh = DishTable() + + cth.insert_one(["Завтрак"]) + cth.insert_one(["Обэд"]) + cth.insert_one(["Ужин"]) + + dsh.insert_one([1, "10 minutes", "Яичница", "Взбить яйца, нарезать помидоры, обжарить их вместе."]) + dsh.insert_one([1, "20 minutes", "Блины", "Замесить тесто, да пожарить. ©️ Никита Сергеич"]) + dsh.insert_one([2, "2 hours", "Хлэб", "Почти, как блины, но не совсем."]) + dsh.insert_one([3, "40 minutes", "Паста", "Почувствуй себя итальянцем"]) + + def db_drop(self): + cth = CathTable() + d = DishTable() + d.drop() + cth.drop() + return + + def show_main_menu(self): + menu = texts.show_main_menu_txt + print(menu) + return + + def read_next_step(self): + return input("=> ").strip() + + def after_main_menu(self, next_step): + if next_step == "2": + self.db_drop() + self.db_init() + self.db_insert_somethings() + print("Таблицы созданы заново!") + return "0" + elif next_step != "1" and next_step != "9": + print("Выбрано неверное число! Повторите ввод!") + return "0" + else: + return next_step; + + def show_cath(self): + self.cath_id = -1 + menu = texts.show_cath_1txt + print(menu) + lst = CathTable().all() + j = 1 + for i in lst: + print(str(j) + "\t" + str(i[0])) + j += 1 + menu = texts.show_cath_2txt + print(menu) + return + + def after_show_cath(self, next_step): + """Выбор действий после вывода категорий + """ + while True: + if next_step == "4": + CathTable().delete(input('Введите название удаляемой категории(1 - для отмены): ')) + return "1" + + elif next_step == "6": #Добавление блюда в категорию + DishTable().insert_dishone(self.cath_id) + next_step = "5" + + elif next_step == "7":#Удаление блюда из категории + del_name = input('Введите название удаляемого блюда (1 - для отмены): ') + while (del_name.strip() == '')or(len(del_name.strip()) > 32)or(add_func.is_cyr_or_dig(del_name.strip())==0): + if(del_name.strip() == ''): + del_name = input("Пустая строка. Повторите ввод! Укажите название удаляемого блюда (0 - отмена): ") + if del_name == "0": + return "1" + elif(len(del_name.strip()) > 32): + del_name = input("Слишком длинная строка. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if del_name == "0": + return "1" + elif(add_func.is_cyr_or_dig(del_name.strip())==0): + del_name = input("Название должно состоять только из символов кириллицы. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if del_name == "0": + return "1" + DishTable().delete(del_name) + next_step = "5" + elif next_step == "5": + next_step = self.show_dish_in_cath() + elif next_step != "0" and next_step != "9" and next_step != "3": + print("Выбрано неверное число! Повторите ввод!") + return "1" + else: + return next_step + + def add_cath(self): + """ + Добавление новой категории в таблицу + """ + data = [] + data.append(input("Введите название (1 - отмена): ").strip()) + if data[0] == "1": + return + while((len(data[0].strip()) == 0)or(len(data[0].strip()) > 32)or(add_func.is_cyr_or_dig(data[0].strip())==0)): + if (len(data[0].strip()) > 32): + data[0] = input("Название слишком длинное! Введите название заново (1 - отмена):").strip() + if data[0] == "1": + return + elif add_func.is_cyr_or_dig(data[0].strip())==0: + data[0] = input("Название должно состоять только из символов кириллицы!\ + Введите название заново (1 - отмена):").strip() + if data[0] == "1": + return + else: + data[0] = input("Название не может быть пустым! Введите название заново (1 - отмена):").strip() + if data[0] == "1": + return + CathTable().insert_one(data) + return + + def show_dish_in_cath(self): + """Вывод всех блюд в выбранной пользователем категории + """ + if self.cath_id == -1: + while True: + name = input("Укажите название категории для вывода блюд (0 - отмена):") + while (name.strip() == '')or(len(name.strip()) > 32)or(add_func.is_cyr_or_dig(name.strip())==0): + if(name.strip() == ''): + name = input("Пустая строка. Повторите ввод! Укажите название категории для вывода блюд (0 - отмена):") + if name == "0": + return "1" + elif(len(name.strip()) > 32): + name = input("Сликшом длинная строка. Повторите ввод!\ + Укажите название категории для вывода блюд (0 - отмена):") + if name == "0": + return "1" + elif(add_func.is_cyr_or_dig(name.strip())==0): + name = input("Название должно состоять только из символов кириллицы. Повторите ввод!\ + Укажите название категории для вывода блюд (0 - отмена):") + if name == "0": + return "1" + flag, cath = CathTable().find_by_name(name) + print(flag) + if flag == 0: + print("Введено неверное название!") + else: + self.cath_id = cath + # self.cath_obj = cath + break + print("Выбрана категория: " + name) + print("Блюда:") + print("№\tНазвание\tВремя приготовления\tКраткая инструкция\ + \n-------------------------------------------------------------------------------------") + lst = DishTable().all_by_cath_id(cath) + j = 1 + for i in lst: + print(str(j) + "\t" + i[2] + "\t\t" + str(i[1]) + "\t\t\t" + str(i[4])) + j += 1 + menu = texts.show_dish_in_cath_txt + print(menu) + return self.read_next_step() + + def main_cycle(self): + """Основной цикл программы, регулирующий порядок действий + """ + current_menu = "0" + next_step = None + + while(current_menu != "9"): + + if current_menu == "0": + self.show_main_menu() + next_step = self.read_next_step() + current_menu = self.after_main_menu(next_step) + + elif current_menu == "1": + self.show_cath() + next_step = self.read_next_step() + current_menu = self.after_show_cath(next_step) + + elif current_menu == "2": + self.show_main_menu() + + elif current_menu == "3": + self.add_cath() + current_menu = "1" + + print("До свидания!") + return + + def test(self): + DbTable.dbconn.test() + +m = Main() +# m.test() +m.main_cycle() \ No newline at end of file diff --git a/project_config.py b/0.5_test/project_config.py similarity index 100% rename from project_config.py rename to 0.5_test/project_config.py diff --git a/0.5_test/tables/__pycache__/cath_table.cpython-311.pyc b/0.5_test/tables/__pycache__/cath_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25e31db8fa7f42788386813723586934332849cb GIT binary patch literal 2436 zcmb7FOK%fb6u$HH1RLALX&OpsCNy9iP>Mjsh(M(%F^?8Z8;lT9q>WZDKbj7OY+_5JZheeOa-<-M6@7(*{dtPkc zzKwugUP{jYArbO7ezXm~nQe^1>mi|pat6r|o}4C>ze}i~bI%1rUc=wB8J>z4NkaO7 zp9#+8Msuwi_TpL}8wbI8NOUs8Q38FqyJSYd5obgy07_H@l&J(5pfZdYaC;`RrNvBk z&d_u1VQ@4a{y6=H3hbBkGX|B=H9TS;HYsOd}R&OwxXp1M7ZGje=IOx$cQ zMl%Gi8^{%nmF0qE@7Sc@D(b!IrITL1TrZx6hjsqH@26u9W|Ch?%>xEY34 z9iiYVvQQLoFq8$3Ex$c7c_Dokz`FtdPGq(Z9|DOqJuygiIz#VUDxq`4qvbR z64cWwU*;)q!#vD`eX3&ET~_9vL-}jJ4*OCGvDKF>`HYs33$v=&_C9@gvRD<$LbZKJ zKW#?JeCM1To{X(#L4kHz=PVo?e5O4+G?hA+%B0j&(-+RGc2vE5CN-T>{e83flW~{W ze0)3+Fmd@^ajBRun5Y3bckHy~R!pmCx&i&Bo?9vDuAD0_FXu}M(ZsECg&SGJ6|Cz3 z*b>)31@p8jQ{B)@x*grzb+04}&8)isu+`zgN2RB?pWJqa4%LSaIpISUp`iq8kzq#} zW^U!yqr*>=PmtI|My^>)ef1 zxF|uRzE1pR;B>ZR8WqcMrIy+KN5#*SCxUvATbGr^F7Kqu=N049fMMf`&NdcUjE7sY2qXJ4|uFX{9qD}ja* zsl~?r>T_a0yb+w(_?w&)n{bo~tO+u)o_3VMx-wW(1{>iW_lxt^b`oUT(UJJ$FZ&k=dolYpOqOp)P&E2MH%SF0k=-`Jm z?fOdAz%|k|Z!s~4nf(aE2$=D`YaMe1JI^NGTnx~$G=Mw)ugP=L0mv|Ika-Cbjt>ea z9mCod$g;GjNqmTgr2S3O4J-;aV>%(Y0XoN$h8vig%V2i*2(jGbll-Wh@S^Qyk)8+HQCd_y-J*&y`VY@T2=V{` literal 0 HcmV?d00001 diff --git a/0.5_test/tables/__pycache__/dish_table.cpython-311.pyc b/0.5_test/tables/__pycache__/dish_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3af5eecb0c682bc3ae31ddd8757462e978301e48 GIT binary patch literal 7033 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 32)\ + or(add_func.is_cyr_or_dig(ins_name.strip())==0)or(DishTable().check_by_name(ins_name)): + + if(ins_name.strip() == ''): + ins_name = input("Пустая строка. Повторите ввод! Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + elif(len(ins_name.strip()) > 32): + ins_name = input("Слишком длинная строка. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + elif(add_func.is_cyr_or_dig(ins_name.strip())==0): + ins_name = input("Название должно состоять только из символов кириллицы. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + else: + print('Такое блюдо уже существует') + ins_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + ins_time = input(f'Процесс добавления блюда: {ins_name}\ + \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + if ins_time == "0": + return "1" + ins_manual = input(f'Процесс добавления блюда: {ins_name}\ + \nВведите краткую инструкцию приготовления блюда (1 - для отмены): ') + if ins_time == "0": + return "1" + + insert = [cath_id, ins_time, ins_name, ins_manual] + DishTable().insert_one(insert) + + + \ No newline at end of file diff --git a/tables/people_table.py b/0.5_test/tables/people_table.py similarity index 100% rename from tables/people_table.py rename to 0.5_test/tables/people_table.py diff --git a/tables/phones_table.py b/0.5_test/tables/phones_table.py similarity index 100% rename from tables/phones_table.py rename to 0.5_test/tables/phones_table.py diff --git a/0.5_test/texts.py b/0.5_test/texts.py new file mode 100644 index 0000000..da2f6df --- /dev/null +++ b/0.5_test/texts.py @@ -0,0 +1,20 @@ +show_main_menu_txt = """Привутствуем в меню, выберите действие: + 1 - просмотр категорий; + 2 - сброс и инициализация БД; + 9 - выход;""" +show_cath_1txt = """Просмотр списка категорий! +№\tНазвание\n-------------------------------------------------------------------------------------""" + +show_cath_2txt = """-------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление новой категории; + 4 - удаление категории; + 5 - просмотр блюд в категории; + 9 - выход.""" + +show_dish_in_cath_txt = """-------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 1 - возврат в просмотр категорий; + 6 - добавление нового блюда; + 7 - удаление блюда; + 9 - выход.""" \ No newline at end of file diff --git a/__pycache__/dbconnection.cpython-311.pyc b/__pycache__/dbconnection.cpython-311.pyc deleted file mode 100644 index 9cbb35483f8c163ff949690db2656deab92f46e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2154 zcmb7F%}*Og6rWkI?J*ehQOBZ$I7^ZuHkC*}R70w&k^!fsrKZB}hY-@%-d(`XVw2gm znphxl$N?dww3Q`t=z$Y$1m~XmN7%?xtd$~F>M1uz6@++xcL0`LT%5zii?(nDcfr2E!iGkcJJkhy?Tn(u9Xd^Bf2W9YSxlMXccz zlEvq2npE3TKH&D`L;_|H=?HAmqM+f2Xwk#47Ddei)T@br;I)G@+38}TpsQA{SWsOL zu-FIP1O4P5AbV&7=V5HM4Wu|MlRG{U$WM8kchNw8%HupkQjr&zR=VMXK52 zYSFah0A(qmEC$LJ(*O{=N6T87tf8+{eK~jE_O(Z{Zaz?p>nk7GezlcfTV#wZ*rKT$ z%eD_@%efVkB}S57$=at&X+5K^E`9mK(oDw6Ol3@c$;f15OIoFrQ{=g=Rk}Kpa zMJZqEJiKv7%mOrj0SePwz%8f2oF`h1}4xLjQ-vWOwXw#GF*?`WJb@z!}aiu zKeeN~jrVUI-EQ3a_-K=JO~2<->;(eyk`acp4c`g)K&pGUsGhT9m%Xhk?o&(DEK=LA-`CZWrL(7EZ7pZnWLdY= z)r?`t9)A684_Mkhs+%RlGTCWLQo9;N23_tyQwmHJ0VDHoAW#RPf!*BGQ1mzyt%am| zNZR%^NcW@eo$hLQqDCg`WU@*oUC}2s604I~mBd_8tVSm4WTHwY8YH+IcuEG3$zY8P z)yYtm47p}wH6quETqSa&KfE{m+wiZ^N_5-j>ffu8(K;EelF>K9^hJKTR|z~GsRZ}& zaowg`&*=@2 jv9mX)fWW(hanpxz-&QaCn&M>)Ue1#jO!o2(3hv`S(>$ps diff --git a/BDLab2-6.pdf b/other/BDLab2-6.pdf similarity index 100% rename from BDLab2-6.pdf rename to other/BDLab2-6.pdf diff --git a/default_project/config.yaml b/other/default_project/config.yaml similarity index 100% rename from default_project/config.yaml rename to other/default_project/config.yaml diff --git a/other/default_project/dbconnection.py b/other/default_project/dbconnection.py new file mode 100644 index 0000000..6fac33c --- /dev/null +++ b/other/default_project/dbconnection.py @@ -0,0 +1,34 @@ +# Установка соединения с базой данных +# (параметры передаются через класс конфиг). +import psycopg2 + +class DbConnection: + + def __init__(self, config): + self.dbname = config.dbname + self.user = config.user + self.password = config.password + self.host = config.host + self.prefix = config.dbtableprefix + self.conn = psycopg2.connect(dbname = self.dbname, + user = self.user, + password = self.password, + host = self.host) + + def __del__(self): + if self.conn: + self.conn.close() + + def test(self): + cur = self.conn.cursor() + cur.execute("DROP TABLE IF EXISTS test CASCADE") + cur.execute("CREATE TABLE test(test integer)") + cur.execute("INSERT INTO test(test) VALUES(1)") + self.conn.commit() + cur.execute("SELECT * FROM test") + result = cur.fetchall() + cur.execute("DROP TABLE test") + self.conn.commit() + return (result[0][0] == 1) + + diff --git a/default_project/dbtable.py b/other/default_project/dbtable.py similarity index 100% rename from default_project/dbtable.py rename to other/default_project/dbtable.py diff --git a/default_project/main.py b/other/default_project/main.py similarity index 100% rename from default_project/main.py rename to other/default_project/main.py diff --git a/other/default_project/project_config.py b/other/default_project/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/other/default_project/project_config.py @@ -0,0 +1,21 @@ +# Загрузка настроек проекта (в данном случае только настроек соединения с БД) +# из файла config.yaml. +import yaml + +class ProjectConfig: + """Класс считывает базовые настройки из файла config.yaml""" + + def __init__(self): + with open('config.yaml') as f: + config = yaml.safe_load(f) + self.dbname = config['dbname'] + self.user = config['user'] + self.password = config['password'] + self.host = config['host'] + self.dbtableprefix = config['dbtableprefix'] + +# Этот метод запускается только, если запускать +# данный файл, а не подключать его. +if __name__ == "__main__": + x = ProjectConfig() + print(x.dbfilepath) diff --git a/other/default_project/tables/people_table.py b/other/default_project/tables/people_table.py new file mode 100644 index 0000000..d27e8ea --- /dev/null +++ b/other/default_project/tables/people_table.py @@ -0,0 +1,23 @@ +# Таблица персоны и особые действия с ней + +from dbtable import * + +class PeopleTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "people" + + def columns(self): + return {"id": ["serial", "PRIMARY KEY"], + "last_name": ["varchar(32)", "NOT NULL"], + "first_name": ["varchar(32)", "NOT NULL"], + "second_name": ["varchar(32)"]} + + def find_by_position(self, num): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + sql += " LIMIT 1 OFFSET %(offset)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {"offset": num - 1}) + return cur.fetchone() + diff --git a/other/default_project/tables/phones_table.py b/other/default_project/tables/phones_table.py new file mode 100644 index 0000000..c6326f0 --- /dev/null +++ b/other/default_project/tables/phones_table.py @@ -0,0 +1,27 @@ +# Таблица Телефоны и особые действия с ней. + +from dbtable import * + +class PhonesTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "phones" + + def columns(self): + return {"person_id": ["integer", "REFERENCES people(id)"], + "phone": ["varchar(12)", "NOT NULL"]} + + def primary_key(self): + return ['person_id', 'phone'] + + def table_constraints(self): + return ["PRIMARY KEY(person_id, phone)"] + + def all_by_person_id(self, pid): + sql = "SELECT * FROM " + self.table_name() + sql += " WHERE person_id = %s" + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql, str(pid)) + return cur.fetchall() + diff --git a/test.py b/other/test.py similarity index 100% rename from test.py rename to other/test.py diff --git a/test.sql b/other/test.sql similarity index 100% rename from test.sql rename to other/test.sql diff --git a/project/Lib/site-packages/psycopg2/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/__init__.cpython-311.pyc index 9b8e13c2856346501b22a7b7afe506c6dbca27e7..bebc802184bf086c5959123a1a395dd784f4e6f7 100644 GIT binary patch delta 47 zcmew%|6ZPNIWI340}zB~nWxDKZ{)ko&13Ik6%&%0n4A&g5kC1Fw+3U(W_g~Q%m6}v B4g&xH delta 56 zcmaDa|3jW{IWI340}#yR)=OI;w2|*Jx2T7URZK`~Vsb`|M|g}&Vo9P?VsYx^x7-?x L`kTdgZZZP^;m#3; diff --git a/project/Lib/site-packages/psycopg2/__pycache__/_json.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/_json.cpython-311.pyc index 0cb7df0e07b51612a1972d0d17458aac264f39db..7c6bb5aa068675a6eeb220f6ded0edbd54e0a189 100644 GIT binary patch delta 47 zcmZ2#H^+`|IWI340}zB~nWycL*~llw!eirN6%&%0n4A&g5kA?LMT0SBa~jKjDF7%^ B4EF#4 delta 56 zcmbPZx73brIWI340}#yR)=T>+y^&9fMby>BDkdZ~F*zf~BRs|>u_Vzcu{d?I35y1! K{^nSg{Zat8x)3n{ diff --git a/project/Lib/site-packages/psycopg2/__pycache__/_range.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/_range.cpython-311.pyc index c1a02ab05fba28292664c5466ef26caee9b6cc05..6bfddfd7c966314d8499aa0573003d126bcc2ebd 100644 GIT binary patch delta 49 zcmbQdk+EwdBj0jfUM>b82+uN4%kbLBw}YL>*2O9&BsDQPBgP|q@@;kv#+c149Q^?R DUri2# delta 58 zcmeC$$T)c;Bj0jfUM>b8n9Hq~X6LbyZwI@mn~POUNNQqoMvO;zj7wrkqEljV>f}r8 N8jSjzf3x=o008dN5?KHM diff --git a/project/Lib/site-packages/psycopg2/__pycache__/errors.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/errors.cpython-311.pyc index d917ecc3df928b3c74b2838e09ab023f1ce016be..0dca915d3f8f0f9754b3be29ee91c7f88b915158 100644 GIT binary patch delta 45 zcmdnVvVnznIWI340}zB~nWt^v$m`C?W9woS6Ox*koDt&@J~@+7gE40EB*x_c3@{A0 delta 54 zcmdnMvXg~(IWI340}#yR)=QhXk=LD3)Xl{zCL}d6IU~j+JjNxlB+)6cICXLYqXwh? Iq(iIWI340}zB~nWrU5Z{&;PVQ0 KfAd04PbmP~MiArx diff --git a/project/Lib/site-packages/yaml/__pycache__/__init__.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/__init__.cpython-311.pyc index 17625b2f77f775b2aa4c0552bb2071bf837d3bfc..5b841e617bf09798674a4a965c0c278d216b1f67 100644 GIT binary patch delta 49 zcmX@n#<;(Yk#9LKFBbz4glCzj%{AP}=g7ok?P3)ZlA4&D5#td)IfY4uF=lfo(|!j4 DS6B{J delta 58 zcmdnr#(1KQk#9LKFBbz4%;nZg6F1n%=g1`L;$jsOlA4&D5#tdaHq)$ delta 55 zcmeA(pKi{(oR^o20SM-D>!k^AdR503_WKumAu6 diff --git a/project/Lib/site-packages/yaml/__pycache__/cyaml.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/cyaml.cpython-311.pyc index fff6130c5a981be70aa3de7290e4703f6db27e67..9becea16b2427f831d3153dbe3c7bba29c2533cb 100644 GIT binary patch delta 46 zcmbQH)vLw3oR^o20SLmg%+m@s@=7xESh!flgrp`WXT*4fPqt=OVT{?Fz`RWm01D&` AB>(^b delta 55 zcmeCxnx@6OoR^o20SM-D>!opTZ02oRP A;s5{u delta 55 zcmZ1>wo#0CIWI340}#yR)=LxJ$XmuN>f~Y-6Ox*koDt&@9^;Z&lIWCJoI1ImS%p!5 J^A_e3b^wx`52gSB diff --git a/project/Lib/site-packages/yaml/__pycache__/emitter.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/emitter.cpython-311.pyc index 4986e5d662e3ca8e0dbe155cad804d709d1e10db..10546bcaa8fcd4f33413f5e936ac5ab87817ea04 100644 GIT binary patch delta 63 zcmeBQ$lSJ&nQu8SFBbz4glCzj<*(VuC&S2NnQu8SFBbz4%;nZg`?q`}pA4g@vx`+sNNQqoMvO;zj7wrkqEljV>SQxU a6-NEd(TpoC8E=&s3 diff --git a/project/Lib/site-packages/yaml/__pycache__/error.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/error.cpython-311.pyc index 70a05f812ff7e59dceed3a2de3859f33412fc207..2f44ada34cf44d51ddcb6de82795bfc643a582e8 100644 GIT binary patch delta 47 zcmZ3eI75+dIWI340}zB~nWq_WZRFd_$YbGR6%&%0n4A&g5kC0=qY7ipW>%&-d;lKg B48Z^Z delta 56 zcmbQCxKNRAIWI340}#yR)=PWJxsh)#qo|{cRZK`~Vsb`|M|g}&Vo9P?VsYx^>x?Rl L`kVhS&fx<9!tD`u diff --git a/project/Lib/site-packages/yaml/__pycache__/events.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/events.cpython-311.pyc index c3b771f1ef3cc7e8dcb8ef017e6c009044cc74a0..26678d6c9c633050818a22300ac0c16024830042 100644 GIT binary patch delta 46 zcmaE$dtH}zIWI340}zB~nWsJ8$Q#eZW9ecQ6Ox*koDt&@KDm)eg)wIHGA1h#06gRk Ai2wiq delta 55 zcmcbv`#_g>IWI340}#yR)=TT%$Q#cj>f~Y-6Ox*koDt&@9^;Z&lIWCJoI1IJNrh2= J^IRq?5dgf(5H$b* diff --git a/project/Lib/site-packages/yaml/__pycache__/loader.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/loader.cpython-311.pyc index fabe1683a9386040df4bf2e7f08b06bd2bf22254..f52223763f79b120a2f677b5f53f46b83cad4ab6 100644 GIT binary patch delta 46 zcmbQEI9ZW*IWI340}zB~nWy<|f~Y-6Ox*koDt&@9^;Z&lIWCJoI1IPS%p!5 J^K|AvJOGHM55NEb diff --git a/project/Lib/site-packages/yaml/__pycache__/nodes.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/nodes.cpython-311.pyc index 5c5958228d1161262e26c7044ecfb8ed133ee85b..165b2065d723e71258f25befadbd3dda25335340 100644 GIT binary patch delta 46 zcmaDLd|jA#IWI340}zB~nWtUc$UB*l$HK)bCL}d6IU~j+eDYRC6~>s&w;0(t06AI> An*aa+ delta 55 zcmcaE{6Ls@IWI340}#yR)=OKkk#{nqsH2NjOh{^Caz>0tc#KP8NupC?aq8qXj4F)! Kn=dl5aR30m3J`1n diff --git a/project/Lib/site-packages/yaml/__pycache__/parser.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/parser.cpython-311.pyc index 2a9e020699c4d28207530d0422e4fe5a1acaf2e3..ea500d0d7c70d096da9f2920c6eed37293d9d90d 100644 GIT binary patch delta 49 zcmbP#l5yHeM!w~|yj%=G5T0e8_9S&9pBN*LrHfTeNNQqoMvO=JWJ^XB#+c10w DX37pD delta 58 zcmbPsl5ze?M!w~|yj%=GFqc~|ZF=%XJ~2j7Cl{-jkkrKFj2Msb7?;G7M5n~!)X4^n MDvbJ@Lm3^D0q)2U)&Kwi diff --git a/project/Lib/site-packages/yaml/__pycache__/reader.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/reader.cpython-311.pyc index c06192267504912a9126fa76c575667fccc2090e..18fcfaef50532e86448f65fa0b8b45042988e804 100644 GIT binary patch delta 47 zcmaFtddrn>IWI340}zB~nWs5RZ{*v~$YbeZ6%&%0n4A&g5kC1AqY7ip=KqXO6aY&x B4*388 delta 56 zcmccR`q-6kIWI340}#yR)=TS>+Q_$^QPj!BDkdZ~F*zf~BRs|>u_Vzcu{d?|MMf1y L{mtJPpC|wT;=U3= diff --git a/project/Lib/site-packages/yaml/__pycache__/representer.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/representer.cpython-311.pyc index 727c85f366d8300bf5152b7439c85948950c0acc..9409e9366a93a518fd9abcaf594a0e383e6cd437 100644 GIT binary patch delta 49 zcmdnl&$ywVk#9LKFBbz4glCzjeYV)hXV1oC=VBETlA4&D5#td)If+e$F=lf+n~@^` DUt10% delta 58 zcmdnc&$zRnk#9LKFBbz4%;nZg%QN4|XU`_;?qU@alA4&D5#tda=_1 B32!3YqPlM?~?%aP!~=B diff --git a/project/Lib/site-packages/yaml/__pycache__/serializer.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/serializer.cpython-311.pyc index 619c076712d92e8ec66d243866083fcf80d936ff..971bd53096a70579b56807a10701233b20244c00 100644 GIT binary patch delta 46 zcmdmGveAThIWI340}zB~nWt^p$ScUmW9woS6Ox*koDt&@KG~R2g)wGx1mhzK03rAc A-v9sr delta 55 zcmdmJvde^bIWI340}#yR)=P8U$ScSw>gHk<6Ox*koDt&@9^;Z&lIWCJoH|*HQH4=| Jvp?e_2>_R{4{`ti diff --git a/project/Lib/site-packages/yaml/__pycache__/tokens.cpython-311.pyc b/project/Lib/site-packages/yaml/__pycache__/tokens.cpython-311.pyc index 4be94d0cfe20ebb99d4309e88be6c201ef3936d0..8ba3f2a2776c1fe8b5eabdad18b10167e9449185 100644 GIT binary patch delta 71 zcmca?ams>sIWI340}zB~nWvR*f~Y-6Ox*koDt&@9^;Z&lIWCJoI2T(S%p!5 fa~yLN5A!X?>dAt9Vv{fO-vF{}LF~