From 2acc148433aab7fcbd9736fb6aebce2c6097681c Mon Sep 17 00:00:00 2001 From: Mariia Zaiets Date: Tue, 3 Jun 2025 20:28:55 +0300 Subject: [PATCH 1/2] Add library.py --- controlsystem | 1 + library.py | 191 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 4 ++ 3 files changed, 196 insertions(+) create mode 160000 controlsystem create mode 100644 library.py diff --git a/controlsystem b/controlsystem new file mode 160000 index 0000000..7345282 --- /dev/null +++ b/controlsystem @@ -0,0 +1 @@ +Subproject commit 7345282b6a94fd46b73fec33d1a1366a4208f19b diff --git a/library.py b/library.py new file mode 100644 index 0000000..9fff2f9 --- /dev/null +++ b/library.py @@ -0,0 +1,191 @@ +from pydantic import BaseModel +from abc import ABC, abstractmethod +from contextlib import contextmanager + +class BookModel(BaseModel): + name: str + author: str + year: int + +class Book: + def __init__(self, model: BookModel): + self.__name = model.name + self.author = model.author + self.year = model.year + + def __str__(self): + return f'Назва: {self.__name}, Автор: {self.author}, Рік видання: {self.year}' + + @staticmethod + def from_txt_line(line: str): + parts = line.strip().split(';') + if len(parts) != 4: + raise ValueError("Неправильний формат рядка") + typ, name, author, year = parts + year = int(year) + if typ == "Book": + return Book(BookModel(name=name, author=author, year=year)) + elif typ == "Magazine": + return Magazine(BookModel(name=name, author=author, year=year)) + else: + raise ValueError(f"Невідомий тип запису: {typ}") + + @property + def name(self): + return self.__name + + def to_txt_line(self) -> str: + return f"Book;{self.name};{self.author};{self.year}" + +class Magazine(Book): + def __init__(self, model: BookModel): + super().__init__(model) + self.number = model.year + + def __str__(self): + return f'Журнал: {self.name}, Редактор: {self.author}, Номер: {self.number}' + + def to_txt_line(self) -> str: + return f"Magazine;{self.name};{self.author};{self.number}" + +class LibraryBook: + def __init__(self, items=None): + self.items = items if items else [] + + def __iter__(self): + self.current_index = 0 + return self + + def __next__(self): + if self.current_index >= len(self.items): + raise StopIteration + item = self.items[self.current_index] + self.current_index += 1 + return item + + def item_generator(self): + for item in self.items: + yield item + + def via_for_loop(self): + for item in self.item_generator(): + print(item) + + def items_by_author(self, author_name: str): + for item in self.items: + if item.author == author_name: + yield item + + @staticmethod + def log_addition(func): + def wrapper(self, item, *args, **kwargs): + print(f"Додавання: {item.name}, автор: {item.author}") + return func(self, item, *args, **kwargs) + return wrapper + + @staticmethod + def check_exists(func): + def wrapper(self, item, *args, **kwargs): + if item not in self.items: + print(f"'{item.name}' не знайдено в бібліотеці.") + return + return func(self, item, *args, **kwargs) + return wrapper + + @log_addition + def add_item(self, item): + self.items.append(item) + + @check_exists + def remove_item(self, item): + self.items.remove(item) + + @staticmethod + @contextmanager + def open_library_file(filename: str, mode: str = 'w'): + f = None + try: + f = open(filename, mode, encoding='utf-8') + yield f + finally: + if f: + f.close() + + def save_to_txt(self, filename): + with LibraryBook.open_library_file(filename, 'w') as f: + for item in self.items: + f.write(item.to_txt_line() + '\n') + print(f"Збережено у {filename}") + + def load_from_txt(self, filename: str): + with LibraryBook.open_library_file(filename, 'r') as f: + for line in f: + try: + item = Book.from_txt_line(line) + self.add_item(item) + except Exception as e: + print(f"Не вдалося завантажити рядок: {line.strip()} помилка: {e}") + +class Workers(ABC): + def __init__(self, name: str): + self.name = name + + @property + @abstractmethod + def job_position(self): + raise NotImplementedError + +class Librarian(Workers): + def __init__(self, name, pos: str = 'бібліотекар'): + super().__init__(name) + self.__job_position = pos + + @property + def job_position(self): + return self.__job_position + +class Cleaner(Workers): + def __init__(self, name, pos: str = 'прибиральник'): + super().__init__(name) + self.__job_position = pos + + @property + def job_position(self): + return self.__job_position + +if __name__ == "__main__": + worker1 = Librarian("Олена") + worker2 = Cleaner("Петро") + + print(f"{worker1.name} працює як {worker1.job_position}") + print(f"{worker2.name} працює як {worker2.job_position}") + + b1 = Book(BookModel(name="Кобзар", author="Т. Шевченко", year=1840)) + b2 = Book(BookModel(name="Фізика", author="І. Франко", year=1900)) + m1 = Magazine(BookModel(name="Наука і Життя", author="Ред. Іваненко", year=3)) + + lib = LibraryBook() + + lib.add_item(b1) + lib.add_item(b2) + lib.add_item(m1) + + print("\n--- Всі записи ---") + lib.via_for_loop() + + print("\n--- Книги автора І. Франко ---") + for item in lib.items_by_author("І. Франко"): + print(item) + + lib.save_to_txt("library.txt") + + lib.remove_item(b2) + + print("\n--- Після видалення ---") + lib.via_for_loop() + + new_lib = LibraryBook() + new_lib.load_from_txt("library.txt") + + print("\n--- Після завантаження з файлу ---") + new_lib.via_for_loop() \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index cff1c5b..c93ce28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,3 +16,7 @@ package-mode = false [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" + +packages = [ + { include = "controlsystem" } +] \ No newline at end of file From 0dcd2d757280975e78f90d0110945c1e060a1cad Mon Sep 17 00:00:00 2001 From: Mariia Zaiets Date: Tue, 3 Jun 2025 23:08:12 +0300 Subject: [PATCH 2/2] poetry --- controlsystem | 1 - project-name/README.md | 0 project-name/pyproject.toml | 19 +++++++++++++++++++ project-name/src/project_name/__init__.py | 0 project-name/tests/__init__.py | 0 pyproject.toml | 13 +++++-------- 6 files changed, 24 insertions(+), 9 deletions(-) delete mode 160000 controlsystem create mode 100644 project-name/README.md create mode 100644 project-name/pyproject.toml create mode 100644 project-name/src/project_name/__init__.py create mode 100644 project-name/tests/__init__.py diff --git a/controlsystem b/controlsystem deleted file mode 160000 index 7345282..0000000 --- a/controlsystem +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7345282b6a94fd46b73fec33d1a1366a4208f19b diff --git a/project-name/README.md b/project-name/README.md new file mode 100644 index 0000000..e69de29 diff --git a/project-name/pyproject.toml b/project-name/pyproject.toml new file mode 100644 index 0000000..4f3c739 --- /dev/null +++ b/project-name/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "project-name" +version = "0.1.0" +description = "" +authors = [ + {name = "Mariia Zaiets",email = "the.the.loon@gmail.com"} +] +readme = "README.md" +requires-python = ">=3.10" +dependencies = [ +] + +[tool.poetry] +packages = [{include = "project_name", from = "src"}] + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/project-name/src/project_name/__init__.py b/project-name/src/project_name/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project-name/tests/__init__.py b/project-name/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml index c93ce28..4f3c739 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,22 +1,19 @@ [project] -name = "learn-python-project" +name = "project-name" version = "0.1.0" description = "" authors = [ - { name = "Ruslan Melnychuk", email = "rmelnyc@softserveinc.com" } + {name = "Mariia Zaiets",email = "the.the.loon@gmail.com"} ] readme = "README.md" requires-python = ">=3.10" dependencies = [ - "pydantic[email] (>=2.11.5,<3.0.0)" ] -package-mode = false +[tool.poetry] +packages = [{include = "project_name", from = "src"}] + [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] build-backend = "poetry.core.masonry.api" - -packages = [ - { include = "controlsystem" } -] \ No newline at end of file