/sibdev_job

Тестовое задание для компании sibdev

Primary LanguagePython

sibdev_job

Тестовое задание для компании Sibdev

Установка:

git clone https://github.com/UncleVasya/sibdev_job.git

cd sibdev_job

docker-compose up

Для удобства важные команды вынесены в Makefile:

* make build
* make run
* make test
* make bash

Использование

Эндпоинты API (также доступны через веб-морду DRF):

http://localhost:8000/api/deals-upload/  - импорт данных о сделках

http://localhost:8000/api/top-customers/ - Список наиболее потратившихся покупателей

По умолчанию показываются Топ 5 покупателей. Это настраивается параметром limit в запросе:
http://localhost:8000/api/top-customers/?limit=10

Запуск тестов:

docker-compose run autotests

или

make test

Что было сделано по заданию.

Основные требования:

  1. Данные хранятся в реляционной БД, взаимодействие с ней осуществляется посредством django ORM.

  1. Ранее загруженные версии файла deals.csv не должны влиять на результат обработки новых.

  1. Эндпоинты соответствуют спецификации

  1. Приложение должно быть контейнирезировано при помощи docker;

  1. Проект не использует глобальных зависимостей за исключением: python, docker, docker-compose;

  1. Readme проекта описывает весь процесс установки, запуска и работы с сервисом;

  1. Требования к фронтенду не предъявляются, интерфейс взаимодействия — RestFul API;

  1. Проект запускается одной командой.

Дополнительно:

  1. Команда, используемая для запуска проекта - docker-compose up;

  1. Кэширование данных, возвращаемых GET-эндпоинтом, с обеспечением достоверности ответов;

  1. Сервис django работает на многопоточном WSGI-сервере;

  1. API реализован на основе DRF.

Бонус:

  • тесты на логику api;
  • тесты на кешируемость ответов;
  • для тестовой конфигурации используется эмулятор redis (fakeredis), чтобы можно было тестировать работу с кешом, не требуя при этом запущенный redis.
  • подключен coverage для тестов (при запуске через make test)
----------------------------------------------------------------------
Ran 10 tests in 1.688s

OK
Destroying test database for alias 'default'...
Name                           Stmts   Miss Branch BrPart  Cover
----------------------------------------------------------------
app/deals/api/paginators.py       13      0      0      0   100%
app/deals/api/serializers.py      24      0      4      0   100%
app/deals/api/views.py            58      4     12      2    91%
app/deals/models.py               22      2      0      0    91%
----------------------------------------------------------------
TOTAL                            117      6     16      2    94%

Что можно улучшить

  • сейчас кеш страниц сбрасывается только при импорте данных через api. Можно сбрасывать кеш при любым изменениях объектов, например через сигналы.
  • добавить тесты на схему api, через jsonschema;
  • проверить отсутствие n+1 проблемы в api и добавить тесты на это.
  • больше тестов на работу с кешом;
  • улучшить структуру проекта:
    • вынести Dockerfile, entrypoint.sh в папку deploy/;
    • разделить docker-compose на локальный и для сборки.
    • настроить CI/CD (gitlab-ci.yml)
    • настроить запуск линтеров при каждом коммите;