From d8ebb04f328d18984c9776b94474ea9432b51368 Mon Sep 17 00:00:00 2001 From: Danil Date: Tue, 5 Mar 2024 02:57:11 +0500 Subject: [PATCH 1/5] task 1 & 2 (add new sources & new standard) --- src/formatters/models.py | 50 ++++++++++++++++ src/formatters/styles/apa.py | 109 ++++++++++++++++++++++++++++++++++ src/formatters/styles/gost.py | 67 ++++++++++++++++++++- src/main.py | 23 +++++-- src/readers/reader.py | 60 ++++++++++++++++++- 5 files changed, 300 insertions(+), 9 deletions(-) create mode 100644 src/formatters/styles/apa.py diff --git a/src/formatters/models.py b/src/formatters/models.py index c9236ca..1e4b255 100644 --- a/src/formatters/models.py +++ b/src/formatters/models.py @@ -78,3 +78,53 @@ class ArticlesCollectionModel(BaseModel): publishing_house: str year: int = Field(..., gt=0) pages: str + + +class JournalArticleModel(BaseModel): + + """ + Модель статьи из журнала: + + .. code-block:: + + JournalArticleModel( + authors="Иванов И.М., Петров С.Н.", + article_title="Наука как искусство", + journal_title="Образование и наука", + year=2020, + journal_issue=10, + pages="25-30", + ) + """ + + authors: str + article_title: str + journal_title: str + year: int = Field(..., gt=0) + journal_issue: int = Field(..., gt=0) + pages: str + + +class NewspaperArticleModel(BaseModel): + + """ + Модель статьи из газеты: + + .. code-block:: + + NewspaperArticleModel( + authors="Иванов И.М., Петров С.Н.", + article_title="Наука как искусство", + newspaper_title="Южный Урал", + year=1980, + date="01.10", + article_number=5, + ) + """ + + authors: str + article_title: str + newspaper_title: str + year: int = Field(..., gt=0) + date: str + article_number: int = Field(..., gt=0) diff --git a/src/formatters/styles/apa.py b/src/formatters/styles/apa.py new file mode 100644 index 0000000..f796837 --- /dev/null +++ b/src/formatters/styles/apa.py @@ -0,0 +1,109 @@ +""" +Стиль цитирования по APA. +""" +from string import Template + +from pydantic import BaseModel + +from formatters.models import BookModel, InternetResourceModel +from formatters.styles.base import BaseCitationStyle +from logger import get_logger + + +logger = get_logger(__name__) + + +class APABook(BaseCitationStyle): + """ + Форматирование для книг. + """ + + data: BookModel + + @property + def template(self) -> Template: + return Template( + "$authors ($year). $title$edition. $publishing_house" + ) + + def substitute(self) -> str: + + logger.info('Форматирование книги "%s" ...', self.data.title) + + return self.template.substitute( + authors=self.data.authors, + title=self.data.title, + edition=self.get_edition(), + city=self.data.city, + publishing_house=self.data.publishing_house, + year=self.data.year, + pages=self.data.pages, + ) + + def get_edition(self) -> str: + """ + Получение отформатированной информации об издательстве. + + :return: Информация об издательстве. + """ + + return f" ({self.data.edition} изд.)" if self.data.edition else "" + + +class APAInternetResource(BaseCitationStyle): + """ + Форматирование для интернет-ресурсов. + """ + + data: InternetResourceModel + + @property + def template(self) -> Template: + return Template( + "$website ($access_date) $article $link" + ) + + def substitute(self) -> str: + + logger.info('Форматирование интернет-ресурса "%s" ...', self.data.article) + + return self.template.substitute( + article=self.data.article, + website=self.data.website, + link=self.data.link, + access_date=self.data.access_date, + ) + + +class APACitationFormatter: + """ + Базовый класс для итогового форматирования списка источников. + """ + + formatters_map = { + BookModel.__name__: APABook, + InternetResourceModel.__name__: APAInternetResource, + } + + def __init__(self, models: list[BaseModel]) -> None: + """ + Конструктор. + + :param models: Список объектов для форматирования + """ + + formatted_items = [] + for model in models: + if type(model).__name__ in self.formatters_map.keys(): + formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore + + self.formatted_items = formatted_items + + def format(self) -> list[BaseCitationStyle]: + """ + Форматирование списка источников. + + :return: + """ + + return sorted(self.formatted_items, key=lambda item: item.formatted) diff --git a/src/formatters/styles/gost.py b/src/formatters/styles/gost.py index b237f8a..8af16ef 100644 --- a/src/formatters/styles/gost.py +++ b/src/formatters/styles/gost.py @@ -5,7 +5,13 @@ from pydantic import BaseModel -from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) from formatters.styles.base import BaseCitationStyle from logger import get_logger @@ -103,6 +109,60 @@ def substitute(self) -> str: ) +class GOSTJournalArticle(BaseCitationStyle): + """ + Форматирование для статьи из журнала. + """ + + data: JournalArticleModel + + @property + def template(self) -> Template: + return Template( + "$authors $article_title // $journal_title. $year. № $journal_issue. С. $pages." + ) + + def substitute(self) -> str: + + logger.info('Форматирование статьи из журнала "%s" ...', self.data.article_title) + + return self.template.substitute( + authors=self.data.authors, + article_title=self.data.article_title, + journal_title=self.data.journal_title, + year=self.data.year, + journal_issue=self.data.journal_issue, + pages=self.data.pages, + ) + + +class GOSTNewspaperArticle(BaseCitationStyle): + """ + Форматирование для статьи из газеты. + """ + + data: NewspaperArticleModel + + @property + def template(self) -> Template: + return Template( + "$authors $article_title // $newspaper_title. $year. № $article_number. $date." + ) + + def substitute(self) -> str: + + logger.info('Форматирование статьи из журнала "%s" ...', self.data.article_title) + + return self.template.substitute( + authors=self.data.authors, + article_title=self.data.article_title, + newspaper_title=self.data.newspaper_title, + year=self.data.year, + date=self.data.date, + article_number=self.data.article_number + ) + + class GOSTCitationFormatter: """ Базовый класс для итогового форматирования списка источников. @@ -112,6 +172,8 @@ class GOSTCitationFormatter: BookModel.__name__: GOSTBook, InternetResourceModel.__name__: GOSTInternetResource, ArticlesCollectionModel.__name__: GOSTCollectionArticle, + JournalArticleModel.__name__: GOSTJournalArticle, + NewspaperArticleModel.__name__: GOSTNewspaperArticle } def __init__(self, models: list[BaseModel]) -> None: @@ -123,7 +185,8 @@ def __init__(self, models: list[BaseModel]) -> None: formatted_items = [] for model in models: - formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore + if type(model).__name__ in self.formatters_map.keys(): + formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore self.formatted_items = formatted_items diff --git a/src/main.py b/src/main.py index 7a9fa8e..8e26c92 100644 --- a/src/main.py +++ b/src/main.py @@ -6,6 +6,7 @@ import click from formatters.styles.gost import GOSTCitationFormatter +from formatters.styles.apa import APACitationFormatter from logger import get_logger from readers.reader import SourcesReader from renderer import Renderer @@ -77,14 +78,24 @@ def process_input( ) models = SourcesReader(path_input).read() - formatted_models = tuple( - str(item) for item in GOSTCitationFormatter(models).format() - ) - logger.info("Генерация выходного файла ...") - Renderer(formatted_models).render(path_output) + formatter_styles = { + CitationEnum.GOST.name: GOSTCitationFormatter, + CitationEnum.APA.name: APACitationFormatter + } + print(citation) + print(formatter_styles.keys()) + if citation in formatter_styles.keys(): + formatted_models = tuple( + str(item) for item in formatter_styles[citation](models).format() + ) + + logger.info("Генерация выходного файла ...") + Renderer(formatted_models).render(path_output) - logger.info("Команда успешно завершена.") + logger.info("Команда успешно завершена.") + else: + logger.error("Неизвестный стиль форматирования") if __name__ == "__main__": diff --git a/src/readers/reader.py b/src/readers/reader.py index 9007a80..2017203 100644 --- a/src/readers/reader.py +++ b/src/readers/reader.py @@ -7,7 +7,13 @@ import openpyxl from openpyxl.workbook import Workbook -from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) from logger import get_logger from readers.base import BaseReader @@ -90,6 +96,56 @@ def attributes(self) -> dict: } +class JournalArticleReader(BaseReader): + """ + Чтение модели статьи из журнала. + """ + + @property + def model(self) -> Type[JournalArticleModel]: + return JournalArticleModel + + @property + def sheet(self) -> str: + return "Статья из журнала" + + @property + def attributes(self) -> dict: + return { + "authors": {0: str}, + "article_title": {1: str}, + "journal_title": {2: str}, + "year": {3: int}, + "journal_issue": {4: int}, + "pages": {5: str} + } + + +class NewspaperArticleReader(BaseReader): + """ + Чтение модели статьи из газеты. + """ + + @property + def model(self) -> Type[NewspaperArticleModel]: + return NewspaperArticleModel + + @property + def sheet(self) -> str: + return "Статья из газеты" + + @property + def attributes(self) -> dict: + return { + "authors": {0: str}, + "article_title": {1: str}, + "newspaper_title": {2: str}, + "year": {3: int}, + "date": {4: str}, + "article_number": {5: int} + } + + class SourcesReader: """ Чтение из источника данных. @@ -100,6 +156,8 @@ class SourcesReader: BookReader, InternetResourceReader, ArticlesCollectionReader, + JournalArticleReader, + NewspaperArticleReader ] def __init__(self, path: str) -> None: From 170a37b6c502a4f56f3040da65b8eeb766a89164 Mon Sep 17 00:00:00 2001 From: Danil Date: Tue, 5 Mar 2024 02:58:28 +0500 Subject: [PATCH 2/5] add tests --- src/tests/conftest.py | 44 +++++++++++++++- src/tests/formatters/test_apa.py | 83 +++++++++++++++++++++++++++++++ src/tests/formatters/test_gost.py | 64 ++++++++++++++++++++++-- src/tests/readers/test_readers.py | 64 +++++++++++++++++++++++- 4 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 src/tests/formatters/test_apa.py diff --git a/src/tests/conftest.py b/src/tests/conftest.py index ac5c9aa..0fe7a50 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -3,7 +3,13 @@ """ import pytest -from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) @pytest.fixture @@ -58,3 +64,39 @@ def articles_collection_model_fixture() -> ArticlesCollectionModel: year=2020, pages="25-30", ) + + +@pytest.fixture +def journal_article_model_fixture() -> JournalArticleModel: + """ + Фикстура модели статьи из журнала. + + :return: JournalArticleModel + """ + + return JournalArticleModel( + authors="Иванов И.М., Петров С.Н.", + article_title="Наука как искусство", + journal_title="Образование и наука", + year=2020, + journal_issue=10, + pages="25-30", + ) + + +@pytest.fixture +def newspaper_article_model_fixture() -> NewspaperArticleModel: + """ + Фикстура модели статьи из газеты. + + :return: NewspaperArticleModel + """ + + return NewspaperArticleModel( + authors="Иванов И.М., Петров С.Н.", + article_title="Наука как искусство", + newspaper_title="Южный Урал", + year=1980, + date="01.10", + article_number=5, + ) diff --git a/src/tests/formatters/test_apa.py b/src/tests/formatters/test_apa.py new file mode 100644 index 0000000..aab9081 --- /dev/null +++ b/src/tests/formatters/test_apa.py @@ -0,0 +1,83 @@ +""" +Тестирование функций оформления списка источников по ГОСТ Р 7.0.5-2008. +""" + +from formatters.base import BaseCitationFormatter +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) +from formatters.styles.apa import ( + APABook, + APAInternetResource +) + + +class TestGOST: + """ + Тестирование оформления списка источников согласно ГОСТ Р 7.0.5-2008. + """ + + def test_book(self, book_model_fixture: BookModel) -> None: + """ + Тестирование форматирования книги. + + :param BookModel book_model_fixture: Фикстура модели книги + :return: + """ + + model = APABook(book_model_fixture) + + assert ( + model.formatted + == "Иванов И.М., Петров С.Н. (2020). Наука как искусство (3-е изд.). Просвещение" + ) + + def test_internet_resource( + self, internet_resource_model_fixture: InternetResourceModel + ) -> None: + """ + Тестирование форматирования интернет-ресурса. + + :param InternetResourceModel internet_resource_model_fixture: Фикстура модели интернет-ресурса + :return: + """ + + model = APAInternetResource(internet_resource_model_fixture) + + assert ( + model.formatted + == "Ведомости (01.01.2021) Наука как искусство https://www.vedomosti.ru" + ) + + def test_citation_formatter( + self, + book_model_fixture: BookModel, + internet_resource_model_fixture: InternetResourceModel, + articles_collection_model_fixture: ArticlesCollectionModel, + journal_article_model_fixture: JournalArticleModel, + newspaper_article_model_fixture: NewspaperArticleModel + ) -> None: + """ + Тестирование функции итогового форматирования списка источников. + + :param BookModel book_model_fixture: Фикстура модели книги + :param InternetResourceModel internet_resource_model_fixture: Фикстура модели интернет-ресурса + :param ArticlesCollectionModel articles_collection_model_fixture: Фикстура модели сборника статей + :param JournalArticleModel journal_article_model_fixture: Фикстура модели статьи из журнала + :param NewspaperArticleModel newspaper_article_model_fixture: Фикстура модели статьи из газеты + :return: + """ + + models = [ + APABook(book_model_fixture), + APAInternetResource(internet_resource_model_fixture) + ] + result = BaseCitationFormatter(models).format() + + # тестирование сортировки списка источников + assert result[0] == models[1] + assert result[1] == models[0] diff --git a/src/tests/formatters/test_gost.py b/src/tests/formatters/test_gost.py index c93e1e7..325b289 100644 --- a/src/tests/formatters/test_gost.py +++ b/src/tests/formatters/test_gost.py @@ -3,8 +3,20 @@ """ from formatters.base import BaseCitationFormatter -from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel -from formatters.styles.gost import GOSTBook, GOSTInternetResource, GOSTCollectionArticle +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) +from formatters.styles.gost import ( + GOSTBook, + GOSTInternetResource, + GOSTCollectionArticle, + GOSTJournalArticle, + GOSTNewspaperArticle +) class TestGOST: @@ -61,11 +73,47 @@ def test_articles_collection( == "Иванов И.М., Петров С.Н. Наука как искусство // Сборник научных трудов. – СПб.: АСТ, 2020. – С. 25-30." ) + def test_journal_article( + self, journal_article_model_fixture: JournalArticleModel + ) -> None: + """ + Тестирование форматирования статьи из журнала. + + :param JournalArticleModel journal_article_model_fixture: Фикстура модели статьи из журнала + :return: + """ + + model = GOSTJournalArticle(journal_article_model_fixture) + + assert ( + model.formatted + == "Иванов И.М., Петров С.Н. Наука как искусство // Образование и наука. 2020. № 10. С. 25-30." + ) + + def test_newspaper_article( + self, newspaper_article_model_fixture: NewspaperArticleModel + ) -> None: + """ + Тестирование форматирования статьи из газеты. + + :param NewspaperArticleModel newspaper_article_model_fixture: Фикстура модели статьи из газеты + :return: + """ + + model = GOSTNewspaperArticle(newspaper_article_model_fixture) + + assert ( + model.formatted + == "Иванов И.М., Петров С.Н. Наука как искусство // Южный Урал. 1980. № 5. 01.10." + ) + def test_citation_formatter( self, book_model_fixture: BookModel, internet_resource_model_fixture: InternetResourceModel, articles_collection_model_fixture: ArticlesCollectionModel, + journal_article_model_fixture: JournalArticleModel, + newspaper_article_model_fixture: NewspaperArticleModel ) -> None: """ Тестирование функции итогового форматирования списка источников. @@ -73,6 +121,8 @@ def test_citation_formatter( :param BookModel book_model_fixture: Фикстура модели книги :param InternetResourceModel internet_resource_model_fixture: Фикстура модели интернет-ресурса :param ArticlesCollectionModel articles_collection_model_fixture: Фикстура модели сборника статей + :param JournalArticleModel journal_article_model_fixture: Фикстура модели статьи из журнала + :param NewspaperArticleModel newspaper_article_model_fixture: Фикстура модели статьи из газеты :return: """ @@ -80,10 +130,14 @@ def test_citation_formatter( GOSTBook(book_model_fixture), GOSTInternetResource(internet_resource_model_fixture), GOSTCollectionArticle(articles_collection_model_fixture), + GOSTJournalArticle(journal_article_model_fixture), + GOSTNewspaperArticle(newspaper_article_model_fixture) ] result = BaseCitationFormatter(models).format() # тестирование сортировки списка источников - assert result[0] == models[2] - assert result[1] == models[0] - assert result[2] == models[1] + assert result[0] == models[3] + assert result[1] == models[2] + assert result[2] == models[4] + assert result[3] == models[0] + assert result[4] == models[1] diff --git a/src/tests/readers/test_readers.py b/src/tests/readers/test_readers.py index 67d863b..7d5036f 100644 --- a/src/tests/readers/test_readers.py +++ b/src/tests/readers/test_readers.py @@ -5,12 +5,20 @@ import pytest -from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel +from formatters.models import ( + BookModel, + InternetResourceModel, + ArticlesCollectionModel, + JournalArticleModel, + NewspaperArticleModel +) from readers.reader import ( BookReader, SourcesReader, InternetResourceReader, ArticlesCollectionReader, + JournalArticleReader, + NewspaperArticleReader ) from settings import TEMPLATE_FILE_PATH @@ -104,6 +112,56 @@ def test_articles_collection(self, workbook: Any) -> None: # проверка общего количества атрибутов assert len(model_type.schema().get("properties", {}).keys()) == 7 + def test_journal_article(self, workbook: Any) -> None: + """ + Тестирование чтения статьи из журнала. + + :param workbook: Объект тестовой рабочей книги. + """ + + models = JournalArticleReader(workbook).read() + + assert len(models) == 1 + model = models[0] + + model_type = JournalArticleModel + + assert isinstance(model, model_type) + assert model.authors == "Иванов И.М., Петров С.Н." + assert model.article_title == "Наука как искусство" + assert model.journal_title == "Образование и наука" + assert model.year == 2020 + assert model.journal_issue == 10 + assert model.pages == "25-30" + + # проверка общего количества атрибутов + assert len(model_type.schema().get("properties", {}).keys()) == 6 + + def test_newspaper_article(self, workbook: Any) -> None: + """ + Тестирование чтения статьи из газеты. + + :param workbook: Объект тестовой рабочей книги. + """ + + models = NewspaperArticleReader(workbook).read() + + assert len(models) == 1 + model = models[0] + + model_type = NewspaperArticleModel + + assert isinstance(model, model_type) + assert model.authors == "Иванов И.М., Петров С.Н." + assert model.article_title == "Наука как искусство" + assert model.newspaper_title == "Южный Урал" + assert model.year == 1980 + assert model.date == "01.10" + assert model.article_number == 5 + + # проверка общего количества атрибутов + assert len(model_type.schema().get("properties", {}).keys()) == 6 + def test_sources_reader(self) -> None: """ Тестирование функции чтения всех моделей из источника. @@ -111,7 +169,7 @@ def test_sources_reader(self) -> None: models = SourcesReader(TEMPLATE_FILE_PATH).read() # проверка общего считанного количества моделей - assert len(models) == 8 + assert len(models) == 10 # проверка наличия всех ожидаемых типов моделей среди типов считанных моделей model_types = {model.__class__.__name__ for model in models} @@ -119,4 +177,6 @@ def test_sources_reader(self) -> None: BookModel.__name__, InternetResourceModel.__name__, ArticlesCollectionModel.__name__, + JournalArticleModel.__name__, + NewspaperArticleModel.__name__ } From 3742aa6fe301288a43dabab418cca04bd1ede426 Mon Sep 17 00:00:00 2001 From: Danil Date: Thu, 7 Mar 2024 21:37:28 +0500 Subject: [PATCH 3/5] Add new format in README & fix a test class name --- README.md | 1 + src/tests/formatters/test_apa.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 33c0486..9662539 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ The application allows you to automate the process of generating a bibliography Supported citation styles: - ГОСТ Р 7.0.5-2008 +- American Psychological Association (APA7) ## Installation diff --git a/src/tests/formatters/test_apa.py b/src/tests/formatters/test_apa.py index aab9081..6068610 100644 --- a/src/tests/formatters/test_apa.py +++ b/src/tests/formatters/test_apa.py @@ -16,7 +16,7 @@ ) -class TestGOST: +class TestAPA: """ Тестирование оформления списка источников согласно ГОСТ Р 7.0.5-2008. """ From d9e2fde2d5d97a797b5508ace9e761f22db40425 Mon Sep 17 00:00:00 2001 From: Danil Date: Thu, 7 Mar 2024 22:14:58 +0500 Subject: [PATCH 4/5] reformat code after code support commands --- src/formatters/styles/apa.py | 10 +++------- src/formatters/styles/gost.py | 16 ++++++++++------ src/main.py | 9 ++++----- src/readers/reader.py | 8 ++++---- src/tests/conftest.py | 2 +- src/tests/formatters/test_apa.py | 18 +++--------------- src/tests/formatters/test_gost.py | 8 ++++---- src/tests/readers/test_readers.py | 6 +++--- 8 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/formatters/styles/apa.py b/src/formatters/styles/apa.py index f796837..084eab8 100644 --- a/src/formatters/styles/apa.py +++ b/src/formatters/styles/apa.py @@ -22,9 +22,7 @@ class APABook(BaseCitationStyle): @property def template(self) -> Template: - return Template( - "$authors ($year). $title$edition. $publishing_house" - ) + return Template("$authors ($year). $title$edition. $publishing_house") def substitute(self) -> str: @@ -59,9 +57,7 @@ class APAInternetResource(BaseCitationStyle): @property def template(self) -> Template: - return Template( - "$website ($access_date) $article $link" - ) + return Template("$website ($access_date) $article $link") def substitute(self) -> str: @@ -94,7 +90,7 @@ def __init__(self, models: list[BaseModel]) -> None: formatted_items = [] for model in models: - if type(model).__name__ in self.formatters_map.keys(): + if type(model).__name__ in self.formatters_map: formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore self.formatted_items = formatted_items diff --git a/src/formatters/styles/gost.py b/src/formatters/styles/gost.py index 8af16ef..bb099b8 100644 --- a/src/formatters/styles/gost.py +++ b/src/formatters/styles/gost.py @@ -10,7 +10,7 @@ InternetResourceModel, ArticlesCollectionModel, JournalArticleModel, - NewspaperArticleModel + NewspaperArticleModel, ) from formatters.styles.base import BaseCitationStyle from logger import get_logger @@ -124,7 +124,9 @@ def template(self) -> Template: def substitute(self) -> str: - logger.info('Форматирование статьи из журнала "%s" ...', self.data.article_title) + logger.info( + 'Форматирование статьи из журнала "%s" ...', self.data.article_title + ) return self.template.substitute( authors=self.data.authors, @@ -151,7 +153,9 @@ def template(self) -> Template: def substitute(self) -> str: - logger.info('Форматирование статьи из журнала "%s" ...', self.data.article_title) + logger.info( + 'Форматирование статьи из журнала "%s" ...', self.data.article_title + ) return self.template.substitute( authors=self.data.authors, @@ -159,7 +163,7 @@ def substitute(self) -> str: newspaper_title=self.data.newspaper_title, year=self.data.year, date=self.data.date, - article_number=self.data.article_number + article_number=self.data.article_number, ) @@ -173,7 +177,7 @@ class GOSTCitationFormatter: InternetResourceModel.__name__: GOSTInternetResource, ArticlesCollectionModel.__name__: GOSTCollectionArticle, JournalArticleModel.__name__: GOSTJournalArticle, - NewspaperArticleModel.__name__: GOSTNewspaperArticle + NewspaperArticleModel.__name__: GOSTNewspaperArticle, } def __init__(self, models: list[BaseModel]) -> None: @@ -185,7 +189,7 @@ def __init__(self, models: list[BaseModel]) -> None: formatted_items = [] for model in models: - if type(model).__name__ in self.formatters_map.keys(): + if type(model).__name__ in self.formatters_map: formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore self.formatted_items = formatted_items diff --git a/src/main.py b/src/main.py index 8e26c92..de568c0 100644 --- a/src/main.py +++ b/src/main.py @@ -5,8 +5,8 @@ import click -from formatters.styles.gost import GOSTCitationFormatter from formatters.styles.apa import APACitationFormatter +from formatters.styles.gost import GOSTCitationFormatter from logger import get_logger from readers.reader import SourcesReader from renderer import Renderer @@ -81,11 +81,10 @@ def process_input( formatter_styles = { CitationEnum.GOST.name: GOSTCitationFormatter, - CitationEnum.APA.name: APACitationFormatter + CitationEnum.APA.name: APACitationFormatter, } - print(citation) - print(formatter_styles.keys()) - if citation in formatter_styles.keys(): + + if citation in formatter_styles: formatted_models = tuple( str(item) for item in formatter_styles[citation](models).format() ) diff --git a/src/readers/reader.py b/src/readers/reader.py index 2017203..b6b7d1e 100644 --- a/src/readers/reader.py +++ b/src/readers/reader.py @@ -12,7 +12,7 @@ InternetResourceModel, ArticlesCollectionModel, JournalArticleModel, - NewspaperArticleModel + NewspaperArticleModel, ) from logger import get_logger from readers.base import BaseReader @@ -117,7 +117,7 @@ def attributes(self) -> dict: "journal_title": {2: str}, "year": {3: int}, "journal_issue": {4: int}, - "pages": {5: str} + "pages": {5: str}, } @@ -142,7 +142,7 @@ def attributes(self) -> dict: "newspaper_title": {2: str}, "year": {3: int}, "date": {4: str}, - "article_number": {5: int} + "article_number": {5: int}, } @@ -157,7 +157,7 @@ class SourcesReader: InternetResourceReader, ArticlesCollectionReader, JournalArticleReader, - NewspaperArticleReader + NewspaperArticleReader, ] def __init__(self, path: str) -> None: diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 0fe7a50..b363fb2 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -8,7 +8,7 @@ InternetResourceModel, ArticlesCollectionModel, JournalArticleModel, - NewspaperArticleModel + NewspaperArticleModel, ) diff --git a/src/tests/formatters/test_apa.py b/src/tests/formatters/test_apa.py index 6068610..0269f31 100644 --- a/src/tests/formatters/test_apa.py +++ b/src/tests/formatters/test_apa.py @@ -3,17 +3,8 @@ """ from formatters.base import BaseCitationFormatter -from formatters.models import ( - BookModel, - InternetResourceModel, - ArticlesCollectionModel, - JournalArticleModel, - NewspaperArticleModel -) -from formatters.styles.apa import ( - APABook, - APAInternetResource -) +from formatters.models import BookModel, InternetResourceModel +from formatters.styles.apa import APABook, APAInternetResource class TestAPA: @@ -57,9 +48,6 @@ def test_citation_formatter( self, book_model_fixture: BookModel, internet_resource_model_fixture: InternetResourceModel, - articles_collection_model_fixture: ArticlesCollectionModel, - journal_article_model_fixture: JournalArticleModel, - newspaper_article_model_fixture: NewspaperArticleModel ) -> None: """ Тестирование функции итогового форматирования списка источников. @@ -74,7 +62,7 @@ def test_citation_formatter( models = [ APABook(book_model_fixture), - APAInternetResource(internet_resource_model_fixture) + APAInternetResource(internet_resource_model_fixture), ] result = BaseCitationFormatter(models).format() diff --git a/src/tests/formatters/test_gost.py b/src/tests/formatters/test_gost.py index 325b289..8c16437 100644 --- a/src/tests/formatters/test_gost.py +++ b/src/tests/formatters/test_gost.py @@ -8,14 +8,14 @@ InternetResourceModel, ArticlesCollectionModel, JournalArticleModel, - NewspaperArticleModel + NewspaperArticleModel, ) from formatters.styles.gost import ( GOSTBook, GOSTInternetResource, GOSTCollectionArticle, GOSTJournalArticle, - GOSTNewspaperArticle + GOSTNewspaperArticle, ) @@ -113,7 +113,7 @@ def test_citation_formatter( internet_resource_model_fixture: InternetResourceModel, articles_collection_model_fixture: ArticlesCollectionModel, journal_article_model_fixture: JournalArticleModel, - newspaper_article_model_fixture: NewspaperArticleModel + newspaper_article_model_fixture: NewspaperArticleModel, ) -> None: """ Тестирование функции итогового форматирования списка источников. @@ -131,7 +131,7 @@ def test_citation_formatter( GOSTInternetResource(internet_resource_model_fixture), GOSTCollectionArticle(articles_collection_model_fixture), GOSTJournalArticle(journal_article_model_fixture), - GOSTNewspaperArticle(newspaper_article_model_fixture) + GOSTNewspaperArticle(newspaper_article_model_fixture), ] result = BaseCitationFormatter(models).format() diff --git a/src/tests/readers/test_readers.py b/src/tests/readers/test_readers.py index 7d5036f..46aad6f 100644 --- a/src/tests/readers/test_readers.py +++ b/src/tests/readers/test_readers.py @@ -10,7 +10,7 @@ InternetResourceModel, ArticlesCollectionModel, JournalArticleModel, - NewspaperArticleModel + NewspaperArticleModel, ) from readers.reader import ( BookReader, @@ -18,7 +18,7 @@ InternetResourceReader, ArticlesCollectionReader, JournalArticleReader, - NewspaperArticleReader + NewspaperArticleReader, ) from settings import TEMPLATE_FILE_PATH @@ -178,5 +178,5 @@ def test_sources_reader(self) -> None: InternetResourceModel.__name__, ArticlesCollectionModel.__name__, JournalArticleModel.__name__, - NewspaperArticleModel.__name__ + NewspaperArticleModel.__name__, } From bf110aca3398164c04899b112e57b975a82f8d70 Mon Sep 17 00:00:00 2001 From: Danil Date: Thu, 7 Mar 2024 23:32:12 +0500 Subject: [PATCH 5/5] some fixes --- docs/source/index.rst | 1 + src/main.py | 3 +-- src/tests/formatters/test_apa.py | 29 ++++++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index f552b0d..b43e6bd 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -7,6 +7,7 @@ Поддерживаемые стили цитирования: - ГОСТ Р 7.0.5-2008 + - American Psychological Association (APA7) Установка ========= diff --git a/src/main.py b/src/main.py index de568c0..e9d70f2 100644 --- a/src/main.py +++ b/src/main.py @@ -22,7 +22,6 @@ class CitationEnum(Enum): """ GOST = "gost" # ГОСТ Р 7.0.5-2008 - MLA = "mla" # Modern Language Association APA = "apa" # American Psychological Association @@ -86,7 +85,7 @@ def process_input( if citation in formatter_styles: formatted_models = tuple( - str(item) for item in formatter_styles[citation](models).format() + str(item) for item in formatter_styles[citation](models).format() # type: ignore ) logger.info("Генерация выходного файла ...") diff --git a/src/tests/formatters/test_apa.py b/src/tests/formatters/test_apa.py index 0269f31..cd9bf71 100644 --- a/src/tests/formatters/test_apa.py +++ b/src/tests/formatters/test_apa.py @@ -3,8 +3,9 @@ """ from formatters.base import BaseCitationFormatter -from formatters.models import BookModel, InternetResourceModel +from formatters.models import BookModel, InternetResourceModel, JournalArticleModel from formatters.styles.apa import APABook, APAInternetResource +from formatters.styles.gost import GOSTJournalArticle class TestAPA: @@ -69,3 +70,29 @@ def test_citation_formatter( # тестирование сортировки списка источников assert result[0] == models[1] assert result[1] == models[0] + + def test_not_implemented_formats( + self, + book_model_fixture: BookModel, + internet_resource_model_fixture: InternetResourceModel, + journal_article_model_fixture: JournalArticleModel, + ) -> None: + """ + Тестирование функции итогового форматирования списка источников. + + :param BookModel book_model_fixture: Фикстура модели книги + :param InternetResourceModel internet_resource_model_fixture: Фикстура модели интернет-ресурса + :param JournalArticleModel journal_article_model_fixture: Фикстура модели статьи из журнала + :return: + """ + + models = [ + APABook(book_model_fixture), + APAInternetResource(internet_resource_model_fixture), + GOSTJournalArticle(journal_article_model_fixture), + ] + result = BaseCitationFormatter(models).format() + + # тестирование сортировки списка источников + assert result[0] == models[1] + assert result[1] == models[0]