Skip to content

Latest commit

 

History

History
129 lines (107 loc) · 6.08 KB

File metadata and controls

129 lines (107 loc) · 6.08 KB

Тестовое задание для стажеров: Сервис для работы с направленным ациклическим графом (DAG)

Техническое задание

Разработайте сервис на FastAPI для хранения и отображения направленных ациклических графов (DAG) (далее - сервис) с хранением данных в PostgreSQL.

Технический стек

  • Язык: Python 3.11
  • Фреймворк: FastAPI
  • База данных: PostgreSQL 13
  • ORM: допускается использовать SQLAlchemy 2.0+, использование ORM не обязательно
  • Контейнеризация: Docker + docker-compose

Содержимое репозитория

Исходный код проекта должен быть размещён в публичном репозитории на GitHub или GitLab, с предоставлением ссылки на него. В корневой директории репозитория должны находиться следующие файлы и папки:

  • файл README.md
    • описание общих принципов работы сервиса
    • описание принятых решений, если они выходят за рамки требований
    • описание как запустить сервис
    • описание как запустить тесты
  • Dockerfile, docker-compose.yaml
  • исходный код сервиса
  • тесты

Требования к графу

Ниже перечислены требования к графу, соблюдение которых должен обеспечивать сервис. Несоблюдение требований при попытке создать или изменить граф по API должно приводить к клиентской ошибке. Коды и содержимое ошибок в ответе API должны соответствовать приложенной спецификации openapi.json.

  1. Граф должен
    • быть ориентированным ациклическим
    • содержать хотя бы одну вершину
  2. Имена вершин должны
    • состоять из символов латинского алфавита
    • иметь длину не более 255 символов
    • быть уникальными в пределах графа, в двух разных графах допускаются вершины с одинаковым именем
  3. Между двумя вершинами может быть только одно ребро

API

  1. Сервис должен предоставлять HTTP API в соответствии с приложенной спецификацией openapi.json.
    • Коды ответа и схемы запросов сервиса обязательно должны соответствовать указанным в спецификации.
  2. Сервис должен поддерживать единовременно
    • не менее 1000 графов
    • не менее 100 вершин в каждом графе
    • не менее 1000 ребер в каждом графе
  3. Сервис должен корректно обрабатывать ошибки, например попытка нарушения ограничений целостности при запросе к БД не должна приводить к ответу 500 Internal server error. Сообщения об ошибках должны быть информативными.

Примеры представления графа.

Список вершин и ребер

{
    "nodes": [
        {"name": "a"},
        {"name": "b"},
        {"name": "c"},
        {"name": "d"}
    ],
    "edges": [
        {"source": "a", "target": "c"},
        {"source": "b", "target": "c"},
        {"source": "c", "target": "d"}
    ]
}

Список смежности

{
  "adjacency_list": {
    "a": [
      "c"
    ],
    "c": [
      "d"
    ],
    "d": [],
    "b": [
      "c"
    ]
  }
}

Список смежности транспонированного графа

{
  "adjacency_list": {
    "a": [],
    "c": [
      "a",
      "b"
    ],
    "d": [
      "c"
    ],
    "b": []
  }
}

Развертывание

  1. Используйте docker для развертывания сервиса и БД
  2. Используйте docker compose для оркестрации контейнеров
  3. Используйте depends и health check для запуска контейнеров в корректном порядке
  4. Используйте перечисленные ниже базовые образы
    • python:3.11-slim для сервиса
    • postgres:13 для СУБД
  5. Сервис должен принимать запросы на порту 8080 после выполнения команды docker-compose up -d --build из корня репозитория.
  6. Пример URL для получения информации о графе:http://localhost:8080/api/graph/1

Тестирование

Должно быть обеспечено тестовое покрытие не менее 80%, используйте для тестирования pytest и встроенный в FastApi TestClient.

Прочее

  1. Запрещено использовать любые нейросетевые инструменты (ChatGPT, Copilot и аналоги) для решения задачи
  2. Запрещено копировать готовые решения с открытых источников за исключением подходящих примеров официальной документации.
  3. Решение должно быть выполнено самостоятельно, демонстрируя ваши реальные навыки