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
- Host: GitHub
- URL: https://github.com/niqzart/ffs-test-task
- Owner: niqzart
- Created: 2022-08-15T21:53:19.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2023-12-03T15:53:14.000Z (over 2 years ago)
- Last Synced: 2024-10-16T22:22:23.438Z (over 1 year ago)
- Topics: flask, pytest, socketio, sqlalchemy, test-task
- Language: Python
- Homepage:
- Size: 153 KB
- Stars: 0
- Watchers: 1
- Forks: 21
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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)