Giter Club home page Giter Club logo

ffs-test-task's Introduction

Тестовое задание

Описание

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

Стек

Начало и установка

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

Про тесты

  • В проекте настроены тесты на pytest для удобства тестирования SIO-интерфейсов
  • Все тесты лежат в папке tests
  • Предопределённые фикстуры:
    • base_client: тестовый flask-клиент (модифицирован в ffs) без авторизации
    • client: тестовый flask-клиент, авторизованный под пользователем из common/constants.py
    • socketio_client: тестовый socketio-клиент, созданный от client
  • Базовые тесты проверяют документацию, ошибки, авторизацию и выход из аккаунта
  • Запуск командой: pytest tests

Задание

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

Рекомендации

Flask-Fullstack

В проекте во всю мощь используется библиотека flask-fullstack (FFS). В ней есть частичная документация, но вот пример использования вытащить из проекта не удалось. Стоит прочитать документацию в файлах:

Никто не запрещает читать код репозитория внутри проекта, где используется эта библиотека: 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-ы. Все их можно увидеть тут

Ко всем классам, наследующим Base (именно Base из common, не db.Model!) теперь добавляется набор полезных методов, которые могут значительно уменьшить объём работы. Они создаются и документированы тут

FFS: Модели для marshalling-а

Реализуются через Pydantic, а точнее модификацию его модели из flask-fullstack: PydanticModel.

Модели стоит создавать внутри тела класса, наследующего Base. Так её название заполнится автоматически и будет привязано к тому ORM-объекту, который она конвертирует. А для моделей, содержащих колонки БД всё ещё проще: в PydanticModel (и её потомках) объявлены статические методы для добавления к модели колонок (column_model).

Проще всего понять это через пример. Две модели внутри User, первая (IndexProfile) с id, username, bio и avatar, взятыми из соответствующих колонок, и вторая (FullProfile) со всеми полями первой и name, surname, patronymic и group, взятыми из соответствующих колонок:

IndexProfile = PydanticModel.column_model(id, username, bio, avatar)
FullProfile = IndexProfile.column_model(name, surname, patronymic, group)
  • Модели объявляются в теле класса, наследующего Base!
  • Названия переменных нужно держать в snake_case, для json-а они будут автоматически конвертированы в kebab-case
  • Регистрировать новые модели не нужно, достаточно просто использовать их в методах, вроде .marshal_with или .lister
FFS: SocketIO

Частично задокументированно внутри проекта, более отделённая документация появится позже...

FFS: Assert Contains (для тестов)

Стиль кода

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

Стиль git-а

  • Желательно соблюдать conventional commits
  • Решить задачу в несколько коммитов
  • Pull Request с мини-описанием приветствуется

Ссылки

Общее

Flask и расширения:

SQLAlchemy:

ffs-test-task's People

Contributors

niqzart avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.