Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions homework/library.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import json
from contextlib import contextmanager
from models import BookModel, MagazineModel
from publications import AbstractPublication, Book, Magazine


def log_action(func):
def wrapper(self, *args, **kwargs):
result = func(self, *args, **kwargs)
print(f'Function {func.__name__} was executed for publication: {result}')
return result

return wrapper


def is_book_exist(func):
def wrapper(self, publication: AbstractPublication):
if publication in self.publications:
print(f'Publication {publication} is in the Library and will be deleted')
func(self, publication)
else:
print(f"There is no such publication as {publication} in the Library. It can not be deleted")
return func

return wrapper


@contextmanager
def file_opener(filename, mode):
file = open(filename, mode)
yield file
file.close()


class Library:
publications: list[AbstractPublication]

def __init__(self):
self.publications = []

def iterate_books(self):
print("Iterating books in the Library:")
library_iterator = iter(self.publications)
for publication in library_iterator:
print(publication)

@log_action
def add_book_to_library(self, publication: AbstractPublication):
self.publications.append(publication)
return publication.__str__()

@is_book_exist
def delete_book_from_library(self, publication: AbstractPublication):
self.publications.remove(publication)

@log_action
def get_books_from_library(self):
return [publications.display_info() for publications in self.publications]

def get_books_from_library_by_author(self, author_name):
print(f"There are publication found by autor name = {author_name}:")
for publication in self.publications:
if publication._model.author == author_name:
yield publication.__str__()

def read_library_from_file(self, filename: str):
print("Reading library from the file")
with file_opener(filename, 'r') as file:
data = json.load(file)
self.publications = []
for item in data:
if 'month' in item:
publication = Magazine(MagazineModel(**item))
else:
publication = Book(BookModel(**item))
self.publications.append(publication)
return self.publications

def write_library_to_file(self, filename: str):
print("Writing library to the file...")
with file_opener(filename, 'w') as file:
json.dump([publication.to_dict() for publication in self.publications], file)
15 changes: 15 additions & 0 deletions homework/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from pydantic import BaseModel, validator


class PublicationModel(BaseModel):
name: str
author: str
year_of_publish: int


class BookModel(PublicationModel):
pass


class MagazineModel(PublicationModel):
month: int
37 changes: 37 additions & 0 deletions homework/publications.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from abc import ABC, abstractmethod
from models import BookModel, MagazineModel


class AbstractPublication(ABC):
@abstractmethod
def display_info(self):
raise NotImplementedError


class Book(AbstractPublication):
def __init__(self, model: BookModel):
self._model = model

def __str__(self):
return f'Publication: {self._model.name} - {self._model.author}, year - {self._model.year_of_publish}'

def display_info(self):
return self.__str__()

def to_dict(self):
return self._model.model_dump()


class Magazine(AbstractPublication):

def __init__(self, model: MagazineModel):
self._model = model

def __str__(self):
return f'Publication: {self._model.name} - {self._model.author}, year - {self._model.year_of_publish}, month - {self._model.month}'

def display_info(self):
return self.__str__()

def to_dict(self):
return self._model.model_dump()
46 changes: 46 additions & 0 deletions homework/run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from publications import Book, Magazine
from library import Library
from models import BookModel, MagazineModel

if __name__ == '__main__':
library = Library()

book_model1 = BookModel(name='Rich Dad Poor Dad', author='Robert Kiyosaki', year_of_publish=1997)
book_model2 = BookModel(name='Your Money Or Your Life', author='Joseph R. Dominguez', year_of_publish=1992)
book_model3 = BookModel(name='Rich Dads Cashflow Quadrant', author='Robert Kiyosaki', year_of_publish=1998)
book_model4 = BookModel(name='Test', author='Test', year_of_publish=1995)
my_book1 = Book(book_model1)
my_book2 = Book(book_model2)
my_book3 = Book(book_model3)
my_book4 = Book(book_model4)
print(my_book1.display_info())
print(my_book2.display_info())
print(my_book3.display_info())

magazine_model1 = MagazineModel(name='Cool', author='N/A', year_of_publish=1990, month=1)
magazine_model2 = MagazineModel(name='Cool', author='N/A', year_of_publish=1990, month=2)
my_magazine1 = Magazine(magazine_model1)
my_magazine2 = Magazine(magazine_model2)
print(my_magazine1.display_info())
print(my_magazine2.display_info())

library.add_book_to_library(my_book1)
library.add_book_to_library(my_book2)
library.add_book_to_library(my_book3)
library.add_book_to_library(my_magazine1)
library.add_book_to_library(my_magazine2)

library.get_books_from_library()

library.iterate_books()
for book in library.get_books_from_library_by_author("Robert Kiyosaki"):
print(book)

library.write_library_to_file('library.txt')

library.delete_book_from_library(my_book2)
library.delete_book_from_library(my_book4)

library2 = Library()
loaded_publications = library2.read_library_from_file('library.txt')
library2.get_books_from_library()