From 4da3ee489342bac707d456ece608ee90901289b9 Mon Sep 17 00:00:00 2001 From: Kirill Martyushov Date: Wed, 4 Mar 2026 22:39:23 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=8E=D0=BD=D0=B8=D1=82-=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20Stellar=20Burge?= =?UTF-8?q?rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 35 +++++++++++++++++++++++ README.md | 52 ++++++++++++++++++++++++++--------- praktikum/__init__.py | 0 praktikum/bun.py | 15 ++++++++++ praktikum/burger.py | 49 +++++++++++++++++++++++++++++++++ praktikum/database.py | 33 ++++++++++++++++++++++ praktikum/ingredient.py | 20 ++++++++++++++ praktikum/ingredient_types.py | 7 +++++ praktikum/praktikum.py | 41 +++++++++++++++++++++++++++ requirements.txt | 2 ++ tests/conftest.py | 41 +++++++++++++++++++++++++++ tests/data.py | 26 ++++++++++++++++++ tests/test_bun.py | 13 +++++++++ tests/test_burger.py | 44 +++++++++++++++++++++++++++++ tests/test_database.py | 45 ++++++++++++++++++++++++++++++ tests/test_ingredient.py | 13 +++++++++ 16 files changed, 423 insertions(+), 13 deletions(-) create mode 100644 .gitignore create mode 100644 praktikum/__init__.py create mode 100644 praktikum/bun.py create mode 100644 praktikum/burger.py create mode 100644 praktikum/database.py create mode 100644 praktikum/ingredient.py create mode 100644 praktikum/ingredient_types.py create mode 100644 praktikum/praktikum.py create mode 100644 requirements.txt create mode 100644 tests/conftest.py create mode 100644 tests/data.py create mode 100644 tests/test_bun.py create mode 100644 tests/test_burger.py create mode 100644 tests/test_database.py create mode 100644 tests/test_ingredient.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ab4f03f16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Виртуальные окружения Python +.env +.envrc +.venv +env/ +venv/ +ENV/ + +# Кэш Python +__pycache__/ +*.pyc + +# Настройки IDE и редакторов +.idea/ +.vscode/ + +# Системные файлы ОС +.DS_Store +Thumbs.db + +# Кэш и отчёты тестирования +.pytest_cache/ +.coverage +.coverage.* +htmlcov/ + +# Инструменты тестирования +.tox/ +.nox/ +.cache +.hypothesis/ + +# Артефакты сборки +dist/ +build/ \ No newline at end of file diff --git a/README.md b/README.md index 272081708..5b899cb16 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,50 @@ -## Задание 1: Юнит-тесты +# Задание 1: Юнит-тесты -### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers +## Автотесты для проверки программы заказа бургеров в Stellar Burgers -### Реализованные сценарии +В проекте реализованы юнит-тесты для проверки работы программы, которая помогает собрать и заказать бургер. -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` +## Реализованные сценарии -Процент покрытия 100% (отчет: `htmlcov/index.html`) +Написаны тесты для следующих классов: -### Структура проекта +- `Bun` +- `Burger` +- `Ingredient` +- `Database` -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. +В тестах используются: +- параметризация (`pytest.mark.parametrize`) +- моки (`unittest.mock`) -### Запуск автотестов +Тестовое покрытие: **78%** -**Установка зависимостей** +HTML-отчет о покрытии находится в файле: -> `$ pip install -r requirements.txt` +`htmlcov/index.html` -**Запуск автотестов и создание HTML-отчета о покрытии** +## Структура проекта -> `$ pytest --cov=praktikum --cov-report=html` +praktikum/ — основной код программы +tests/ — автотесты + +Тесты разделены по классам: + +- `test_bun.py` +- `test_burger.py` +- `test_ingredient.py` +- `test_database.py` + +## Запуск автотестов + +### Установка зависимостей + +`pip install -r requirements.txt` + +### Запуск тестов и генерация отчета о покрытии + +`pytest --cov=praktikum --cov-report=html` + +После выполнения отчёт можно открыть в браузере: + +`htmlcov/index.html` \ No newline at end of file diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/bun.py b/praktikum/bun.py new file mode 100644 index 000000000..5504bc1f4 --- /dev/null +++ b/praktikum/bun.py @@ -0,0 +1,15 @@ +class Bun: + """ + Модель булочки для бургера. + Булочке можно дать название и назначить цену. + """ + + def __init__(self, name: str, price: float): + self.name = name + self.price = price + + def get_name(self) -> str: + return self.name + + def get_price(self) -> float: + return self.price diff --git a/praktikum/burger.py b/praktikum/burger.py new file mode 100644 index 000000000..a9604c6c6 --- /dev/null +++ b/praktikum/burger.py @@ -0,0 +1,49 @@ +from typing import List + +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient + + +class Burger: + """ + Модель бургера. + Бургер состоит из булочек и ингредиентов (начинка или соус). + Ингредиенты можно перемещать и удалять. + Можно распечать чек с информацией о бургере. + """ + + def __init__(self): + self.bun = None + self.ingredients: List[Ingredient] = [] + + def set_buns(self, bun: Bun): + self.bun = bun + + + def add_ingredient(self, ingredient: Ingredient): + self.ingredients.append(ingredient) + + def remove_ingredient(self, index: int): + del self.ingredients[index] + + def move_ingredient(self, index: int, new_index: int): + self.ingredients.insert(new_index, self.ingredients.pop(index)) + + def get_price(self) -> float: + price = self.bun.get_price() * 2 + + for ingredient in self.ingredients: + price += ingredient.get_price() + + return price + + def get_receipt(self) -> str: + receipt: List[str] = [f'(==== {self.bun.get_name()} ====)'] + + for ingredient in self.ingredients: + receipt.append(f'= {str(ingredient.get_type()).lower()} {ingredient.get_name()} =') + + receipt.append(f'(==== {self.bun.get_name()} ====)\n') + receipt.append(f'Price: {self.get_price()}') + + return '\n'.join(receipt) diff --git a/praktikum/database.py b/praktikum/database.py new file mode 100644 index 000000000..4c75baf71 --- /dev/null +++ b/praktikum/database.py @@ -0,0 +1,33 @@ +from typing import List + +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + + +class Database: + """ + Класс с методами по работе с базой данных. + """ + + def __init__(self): + self.buns: List[Bun] = [] + self.ingredients: List[Ingredient] = [] + + self.buns.append(Bun("black bun", 100)) + self.buns.append(Bun("white bun", 200)) + self.buns.append(Bun("red bun", 300)) + + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "sour cream", 200)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "chili sauce", 300)) + + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 100)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "dinosaur", 200)) + self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "sausage", 300)) + + def available_buns(self) -> List[Bun]: + return self.buns + + def available_ingredients(self) -> List[Ingredient]: + return self.ingredients diff --git a/praktikum/ingredient.py b/praktikum/ingredient.py new file mode 100644 index 000000000..0e50db8a2 --- /dev/null +++ b/praktikum/ingredient.py @@ -0,0 +1,20 @@ +class Ingredient: + """ + Модель ингредиента. + Ингредиент: начинка или соус. + У ингредиента есть тип (начинка или соус), название и цена. + """ + + def __init__(self, ingredient_type: str, name: str, price: float): + self.type = ingredient_type + self.name = name + self.price = price + + def get_price(self) -> float: + return self.price + + def get_name(self) -> str: + return self.name + + def get_type(self) -> str: + return self.type diff --git a/praktikum/ingredient_types.py b/praktikum/ingredient_types.py new file mode 100644 index 000000000..34940ad5d --- /dev/null +++ b/praktikum/ingredient_types.py @@ -0,0 +1,7 @@ +""" +Перечисление с типами ингредиентов. +SAUCE – соус +FILLING – начинка +""" +INGREDIENT_TYPE_SAUCE = 'SAUCE' +INGREDIENT_TYPE_FILLING = 'FILLING' diff --git a/praktikum/praktikum.py b/praktikum/praktikum.py new file mode 100644 index 000000000..ec522fa6d --- /dev/null +++ b/praktikum/praktikum.py @@ -0,0 +1,41 @@ +from typing import List + +from praktikum.bun import Bun +from praktikum.burger import Burger +from praktikum.database import Database +from praktikum.ingredient import Ingredient + + +def main(): + # Инициализируем базу данных + database: Database = Database() + + # Создадим новый бургер + burger: Burger = Burger() + + # Считаем список доступных булок из базы данных + buns: List[Bun] = database.available_buns() + + # Считаем список доступных ингредиентов из базы данных + ingredients: List[Ingredient] = database.available_ingredients() + + # Соберём бургер + burger.set_buns(buns[0]) + + burger.add_ingredient(ingredients[1]) + burger.add_ingredient(ingredients[4]) + burger.add_ingredient(ingredients[3]) + burger.add_ingredient(ingredients[5]) + + # Переместим слой с ингредиентом + burger.move_ingredient(2, 1) + + # Удалим ингредиент + burger.remove_ingredient(3) + + # Распечатаем рецепт бургера + print(burger.get_receipt()) + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..99dd8a6d5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==9.0.1 +pytest-cov==7.0.0 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..56adfbd6f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,41 @@ +import sys +import os + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +import pytest +import praktikum.ingredient_types as ing_type + + +from unittest.mock import Mock +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.burger import Burger + + +@pytest.fixture +def bun(): + mock_bun = Mock(spec_set=Bun) + mock_bun.get_name.return_value = 'black bun' + mock_bun.get_price.return_value = 100 + return mock_bun + +@pytest.fixture +def ingredient_filling(): + mock_ingridient = Mock(spec_set=Ingredient) + mock_ingridient.get_name.return_value = 'cutlet' + mock_ingridient.get_price.return_value = 100 + mock_ingridient.get_type.return_value = ing_type.INGREDIENT_TYPE_FILLING + return mock_ingridient + +@pytest.fixture +def ingredient_sauce(): + mock_ingridient = Mock(spec_set=Ingredient) + mock_ingridient.get_name.return_value = 'chili sauce' + mock_ingridient.get_price.return_value = 300 + mock_ingridient.get_type.return_value = ing_type.INGREDIENT_TYPE_SAUCE + return mock_ingridient + +@pytest.fixture +def burger(): + return Burger() \ No newline at end of file diff --git a/tests/data.py b/tests/data.py new file mode 100644 index 000000000..b1ab03715 --- /dev/null +++ b/tests/data.py @@ -0,0 +1,26 @@ +from praktikum.ingredient_types import INGREDIENT_TYPE_FILLING, INGREDIENT_TYPE_SAUCE + + +BUN = [ + ('black bun', 100), + ('white bun', 200), + ('red bun', 300) +] + +BUN_WITH_INDEX = [ + (0, 'black bun', 100), + (1, 'white bun', 200), + (2, 'red bun', 300) +] + +FILLING = [ + (INGREDIENT_TYPE_FILLING, "cutlet", 100), + (INGREDIENT_TYPE_FILLING, "dinosaur", 200), + (INGREDIENT_TYPE_FILLING, "sausage", 300), +] + +SAUCE = [ + (INGREDIENT_TYPE_SAUCE, "hot sauce", 100), + (INGREDIENT_TYPE_SAUCE, "sour cream", 200), + (INGREDIENT_TYPE_SAUCE, "chili sauce", 300), +] diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..575c17826 --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,13 @@ +import pytest + + +from praktikum.bun import Bun +from tests.data import BUN + +class TestBun: + @pytest.mark.parametrize('name, price', BUN) + def test_bun_getters(self, name, price): + bun = Bun(name, price) + + assert bun.get_name() == name + assert bun.get_price() == price \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..4f4c011a6 --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,44 @@ +class TestBurger: + def test_burger_initialization(self, burger): + assert burger.bun is None + assert burger.ingredients == [] + + def test_burger_set_buns(self, burger, bun): + burger.set_buns(bun) + assert burger.bun == bun + + def test_burger_add_ingredient(self, burger, ingredient_filling): + burger.add_ingredient(ingredient_filling) + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == ingredient_filling + + def test_burger_remove_ingredient(self, burger, ingredient_filling): + burger.add_ingredient(ingredient_filling) + burger.remove_ingredient(0) + assert burger.ingredients == [] + + def test_burger_move_ingredient(self, burger, ingredient_filling, ingredient_sauce): + burger.add_ingredient(ingredient_filling) + burger.add_ingredient(ingredient_sauce) + burger.move_ingredient(0, 1) + assert burger.ingredients == [ingredient_sauce, ingredient_filling] + + def test_burger_get_price(self,burger, bun, ingredient_filling, ingredient_sauce): + burger.set_buns(bun) + burger.add_ingredient(ingredient_filling) + burger.add_ingredient(ingredient_sauce) + assert burger.get_price() == 600 + + def test_get_receipt(self,burger, bun, ingredient_filling, ingredient_sauce): + burger.set_buns(bun) + burger.add_ingredient(ingredient_filling) + burger.add_ingredient(ingredient_sauce) + receipt = burger.get_receipt() + expected_receipt = ( + "(==== black bun ====)\n" + "= filling cutlet =\n" + "= sauce chili sauce =\n" + "(==== black bun ====)\n" + "Price: 600" + ) + assert receipt.replace("\n\n", "\n") == expected_receipt \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..eb564d3bc --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,45 @@ +import pytest + + +from praktikum.database import Database +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from tests.data import FILLING, SAUCE, BUN_WITH_INDEX + + +class TestDatabase: + def test_database_has_three_buns(self): + db = Database() + assert len(db.available_buns()) == 3 + + def test_database_has_six_ingredients(self): + db = Database() + assert len(db.available_ingredients()) == 6 + + @pytest.mark.parametrize("index, name, price", BUN_WITH_INDEX) + def test_available_buns_content(self, index, name, price): + db = Database() + buns = db.available_buns() + assert buns[index].get_name() == name + assert buns[index].get_price() == price + + @pytest.mark.parametrize("ingredient_type, name, price", FILLING + SAUCE) + def test_available_ingredients_content(self, ingredient_type, name, price): + db = Database() + ingredients = db.available_ingredients() + assert any( + ingredient.get_type() == ingredient_type + and ingredient.get_name() == name + and ingredient.get_price() == price + for ingredient in ingredients + ) + + def test_database_returns_buns_as_bun_objects(self): + db = Database() + buns = db.available_buns() + assert all(isinstance(b, Bun) for b in buns) + + def test_database_returns_ingredients_as_ingredient_objects(self): + db = Database() + ingredients = db.available_ingredients() + assert all(isinstance(i, Ingredient) for i in ingredients) \ No newline at end of file diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..85cc7ce24 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,13 @@ +import pytest + +from praktikum.ingredient import Ingredient +from tests.data import FILLING, SAUCE + +class TestIngredient: + @pytest.mark.parametrize('ingredient_type, name, price', FILLING + SAUCE) + def test_ingredient_getters(self, ingredient_type, name, price): + ingredient = Ingredient(ingredient_type, name, price) + + assert ingredient.get_type() == ingredient_type + assert ingredient.get_name() == name + assert ingredient.get_price() == price \ No newline at end of file From 1196d5f57df39e20db9558f7eda57062118b9b0b Mon Sep 17 00:00:00 2001 From: Kirill Martyushov Date: Wed, 4 Mar 2026 22:47:32 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.py | 15 -------------- burger.py | 48 --------------------------------------------- database.py | 33 ------------------------------- ingredient.py | 20 ------------------- ingredient_types.py | 7 ------- praktikum.py | 41 -------------------------------------- 6 files changed, 164 deletions(-) delete mode 100644 bun.py delete mode 100644 burger.py delete mode 100644 database.py delete mode 100644 ingredient.py delete mode 100644 ingredient_types.py delete mode 100644 praktikum.py diff --git a/bun.py b/bun.py deleted file mode 100644 index 5504bc1f4..000000000 --- a/bun.py +++ /dev/null @@ -1,15 +0,0 @@ -class Bun: - """ - Модель булочки для бургера. - Булочке можно дать название и назначить цену. - """ - - def __init__(self, name: str, price: float): - self.name = name - self.price = price - - def get_name(self) -> str: - return self.name - - def get_price(self) -> float: - return self.price diff --git a/burger.py b/burger.py deleted file mode 100644 index 2b3b6a88b..000000000 --- a/burger.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import List - -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient - - -class Burger: - """ - Модель бургера. - Бургер состоит из булочек и ингредиентов (начинка или соус). - Ингредиенты можно перемещать и удалять. - Можно распечать чек с информацией о бургере. - """ - - def __init__(self): - self.bun = None - self.ingredients: List[Ingredient] = [] - - def set_buns(self, bun: Bun): - self.bun = bun - - def add_ingredient(self, ingredient: Ingredient): - self.ingredients.append(ingredient) - - def remove_ingredient(self, index: int): - del self.ingredients[index] - - def move_ingredient(self, index: int, new_index: int): - self.ingredients.insert(new_index, self.ingredients.pop(index)) - - def get_price(self) -> float: - price = self.bun.get_price() * 2 - - for ingredient in self.ingredients: - price += ingredient.get_price() - - return price - - def get_receipt(self) -> str: - receipt: List[str] = [f'(==== {self.bun.get_name()} ====)'] - - for ingredient in self.ingredients: - receipt.append(f'= {str(ingredient.get_type()).lower()} {ingredient.get_name()} =') - - receipt.append(f'(==== {self.bun.get_name()} ====)\n') - receipt.append(f'Price: {self.get_price()}') - - return '\n'.join(receipt) diff --git a/database.py b/database.py deleted file mode 100644 index 4c75baf71..000000000 --- a/database.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import List - -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING - - -class Database: - """ - Класс с методами по работе с базой данных. - """ - - def __init__(self): - self.buns: List[Bun] = [] - self.ingredients: List[Ingredient] = [] - - self.buns.append(Bun("black bun", 100)) - self.buns.append(Bun("white bun", 200)) - self.buns.append(Bun("red bun", 300)) - - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "sour cream", 200)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_SAUCE, "chili sauce", 300)) - - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 100)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "dinosaur", 200)) - self.ingredients.append(Ingredient(INGREDIENT_TYPE_FILLING, "sausage", 300)) - - def available_buns(self) -> List[Bun]: - return self.buns - - def available_ingredients(self) -> List[Ingredient]: - return self.ingredients diff --git a/ingredient.py b/ingredient.py deleted file mode 100644 index 0e50db8a2..000000000 --- a/ingredient.py +++ /dev/null @@ -1,20 +0,0 @@ -class Ingredient: - """ - Модель ингредиента. - Ингредиент: начинка или соус. - У ингредиента есть тип (начинка или соус), название и цена. - """ - - def __init__(self, ingredient_type: str, name: str, price: float): - self.type = ingredient_type - self.name = name - self.price = price - - def get_price(self) -> float: - return self.price - - def get_name(self) -> str: - return self.name - - def get_type(self) -> str: - return self.type diff --git a/ingredient_types.py b/ingredient_types.py deleted file mode 100644 index 34940ad5d..000000000 --- a/ingredient_types.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -Перечисление с типами ингредиентов. -SAUCE – соус -FILLING – начинка -""" -INGREDIENT_TYPE_SAUCE = 'SAUCE' -INGREDIENT_TYPE_FILLING = 'FILLING' diff --git a/praktikum.py b/praktikum.py deleted file mode 100644 index ec522fa6d..000000000 --- a/praktikum.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import List - -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient - - -def main(): - # Инициализируем базу данных - database: Database = Database() - - # Создадим новый бургер - burger: Burger = Burger() - - # Считаем список доступных булок из базы данных - buns: List[Bun] = database.available_buns() - - # Считаем список доступных ингредиентов из базы данных - ingredients: List[Ingredient] = database.available_ingredients() - - # Соберём бургер - burger.set_buns(buns[0]) - - burger.add_ingredient(ingredients[1]) - burger.add_ingredient(ingredients[4]) - burger.add_ingredient(ingredients[3]) - burger.add_ingredient(ingredients[5]) - - # Переместим слой с ингредиентом - burger.move_ingredient(2, 1) - - # Удалим ингредиент - burger.remove_ingredient(3) - - # Распечатаем рецепт бургера - print(burger.get_receipt()) - - -if __name__ == "__main__": - main()