An open API service indexing awesome lists of open source software.

https://github.com/niqzart/ffs-test-task


https://github.com/niqzart/ffs-test-task

flask pytest socketio sqlalchemy test-task

Last synced: 10 months ago
JSON representation

Awesome Lists containing this project

README

          

# Тестовое задание
- [Описание](#Описание)
- [Задание](#Задание)
- [Рекомендации](#Рекомендации)
- [Ссылки](#Ссылки)

## Описание
Репозиторий-заготовка для выполнения тестового задания для вступления в команду бэкенда. Призван погрузить в стек проекта, познакомить с используемыми библиотеками, в том числе внутрипроектными.

### Стек
- Язык программирования: [Python](https://www.python.org/downloads/) 3.11+
- ORM-система: [SQLAlchemy](https://www.sqlalchemy.org/) 2.0+
- Микро-фреймворк: [Flask](https://flask.palletsprojects.com/en/2.2.x/) 2.0+
- ORM-Плагин: [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/) 3.0+
- При участии: [Flask-RESTX](https://flask-restx.readthedocs.io/en/latest/index.html)
- Не забывая о: [Pydantic-Marshals](https://github.com/niqzart/pydantic-marshals)
- А также: [Flask-Fullstack](https://github.com/niqzart/flask-fullstack) 0.5.10

### Начало и установка
1. Создать публичный fork репозитория
2. Склонировать репозиторий себе
3. Создать виртуальное окружение **на python 3.11**
4. Установить зависимости:
```sh
pip install poetry==1.5.1
poetry install
```
5. Запусить файл `app.py`, можно создать Run Configuration на его запуск
6. Проверить, документация работает: [http://localhost:5000/doc/](http://localhost:5000/doc/)

### Про тесты
- В проекте настроены тесты на [pytest](https://docs.pytest.org/en/7.3.x/) для удобства тестирования SIO-интерфейсов
- Все тесты лежат в папке `tests`
- Предопределённые фикстуры:
- `client`: тестовый flask-клиент (модифицирован в ffs)
- `socketio_client`: тестовый socketio-клиент, созданный от `client`
- Базовые тесты проверяют документацию, ошибки и авторизацию
- Запуск командой: `pytest tests`

## Задание
Само задание будет кастомизированно для каждого!

## Рекомендации
### Pydantic-Marshals
Библиотека для автоматического создания частичных pydantic-моделей. В проекте используется для:
- Создания валидаторов из SQLAlchemy-маппингов ([пример в readme](https://github.com/niqzart/pydantic-marshals#sqlalchemy-basic-usage))
- Тестирования json-ответов приложения ([документация](https://github.com/niqzart/pydantic-marshals/blob/main/docs/assert-contains.md))

### Flask-Fullstack
В проекте во всю мощь используется библиотека flask-fullstack (FFS). В ней есть частичная документация, но вот пример использования вытащить из проекта не удалось. Стоит прочитать документацию в файлах:
- [Интерфейсы для БД](https://github.com/niqzart/flask-fullstack/blob/d54696b1b982015eb64790174d42bd21f7811a46/flask_fullstack/base/interfaces.py)
- [.database_searcher](https://github.com/niqzart/flask-fullstack/blob/d54696b1b982015eb64790174d42bd21f7811a46/flask_fullstack/base/mixins.py#L48)
- [.jwt_authorizer](https://github.com/niqzart/flask-fullstack/blob/d54696b1b982015eb64790174d42bd21f7811a46/flask_fullstack/base/mixins.py#L96)
- [ResourceController + его методы](https://github.com/niqzart/flask-fullstack/blob/d54696b1b982015eb64790174d42bd21f7811a46/flask_fullstack/restx/controller.py)

Никто не запрещает читать код репозитория внутри проекта, где используется эта библиотека: [xi.backend](https://github.com/xi-effect/xi.backend)

Знание flask-restx и sqlalchemy сильно поможет в понимании ffs, уже с этими знаниями можно почитать информационный материал ниже:

FFS: Порядок декораторов

Все упаковщики запросов (`.a_response`, `.marshal_with`, `.marshal_list_with` или `.lister`) должны быть последним декоратором перед методами в `Resource`. Иначе вылет ошибки из других декораторов (`.argument_parser`, `.database_searcher`, `.jwt_authorizer`) будет либо подавлен, либо завёрнут в дополнительный слой ненужной вложенности, нарушая описанное в документации. Технически не относится к декораторам документирования, но ради лучшей читабельности и общности стоит везде складывать декораторы в одинаковом порядке.

- все декораторы документации параметров запроса
- все декораторы документации формата ответов
- декоратор авторизации (`.jwt_authorizer`)
- декоратор парсинга аргументов (`.argument_parser`)
- декоратор(-ы) поиска объектов в бд (`.database_searcher`)
- декоратор пост-обработки ответа (`.a_response`, `.marshal_with`, `.marshal_list_with` или `.lister`)

FFS: Shortcut-ы для БД

К объекту `db.session` добавлено несколько методов, упрощающих работу с логикой БД. По сути это простые shortcut-ы. Все их можно увидеть [тут](https://github.com/niqzart/flask-fullstack/blob/93d3c6696c33171315c078ab88c68ca7f7094361/flask_fullstack/utils/sqlalchemy.py#L21)

Ко всем классам, наследующим `Base` (именно `Base` из `common`, не `db.Model`!) теперь добавляется набор полезных методов, которые могут значительно уменьшить объём работы. Они создаются и документированы [тут](https://github.com/niqzart/ffs-test-task/blob/main/common/config.py#L67)

[FFS: SocketIO (частичная дока внутри проекта)](https://github.com/xi-effect/xieffect-backend/pull/110)

### Стиль кода
- **Будет проверяться**
- Соблюдение PEP8 обязательно
- Желательно не забывать Zen
- DRY приветствуется
- Автоматическое реформатирование рекомендуется
- Стоит поглядывать на стиль других файлов проекта

### Стиль git-а
- Желательно соблюдать [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
- Решить задачу в несколько коммитов
- Pull Request с мини-описанием приветствуется

## Ссылки
### Общее
- [PEP8](https://www.python.org/dev/peps/pep-0008/)
- [pytest](https://docs.pytest.org/en/6.2.x/contents.html)

### Flask и расширения:
- [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/)
- [Flask-JWT-Extened](https://flask-jwt-extended.readthedocs.io/en/stable/)
- [Flask-RESTX](https://flask-restx.readthedocs.io/en/latest/index.html)
- [Flask Testing](https://flask.palletsprojects.com/en/2.0.x/testing/)

### SQLAlchemy:
- [Полный туториал](https://docs.sqlalchemy.org/en/20/tutorial/index.html)
- [Построение табличек](https://docs.sqlalchemy.org/en/20/tutorial/metadata.html#tutorial-orm-table-metadata)
- [ORM Relationships](https://docs.sqlalchemy.org/en/20/tutorial/orm_related_objects.html)
- [Insert-Update-Delete в ORM](https://docs.sqlalchemy.org/en/20/tutorial/orm_data_manipulation.html)
- [Select в ORM](https://docs.sqlalchemy.org/en/20/orm/queryguide/select.html)