Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Бэк: API Endpoint Sampler

Для уверенных в себе, задача на неделю

Пусть существует Rails приложение с некоторым HTTP API. Будем каждый URL этого API считать эндпоинтом, например:

GET /api/v1/projects/:project_id/notes
GET /api/v1/projects/:project_id/notes/:note_id
POST /api/v2/projects
PUT /api/v3/projects/:project_id

Что хочется получить:

Gem для сбора, просмотра и тэгирования проб (пар запрос/ответ) определенных эндпоинтов HTTP API произвольного Rails-приложения. Тэгом считать произвольную строку.

Что нужно реализовать:

Gem, умеющий следующее:

  • Собирать пробы (пары запрос/ответ) с заданных эндпоинтов, сохранять их в соответствии с правилами:

    • Пробой считать кортеж из:
      • даты-времени;
      • URL запроса;
      • HTTP метода;
      • параметров запроса;
      • тела запроса;
      • тела ответа;
      • набора тэгов.
    • Лимитировать сбор проб: не более Y проб за время X;
    • Автоматически очищать устаревшие пробы по мере получения свежих;
    • Оказывать минимальное влияние на скорость выполнения самого запроса Rails приложением;
    • Хранение организовать на PostgreSQL.
  • Задавать базовую конфигурацию:

    • Ограничение на список эндпоинтов в целом (например, через regexp);
    • Черный список эндпоинтов;
    • Сколько запросов хранить по каждому эндпоинту;
    • Как долго хранить пробу;
    • Сохранять за время X не более Y проб.
  • Конфигурировать обработчики для назначения тегов в момент сбора (например, через lambda функции):

    Sampler.configure do |config|
      config.tag_with "slow", ->(request) { request.time > 200 }
    end
  • Просматривать сохраненные пробы, с возможностями:

    • Получения списка доступных эндпоинтов приложения (ограниченных в соответствии с конфигурацией) с количеством имеющихся по ним проб;
    • Получения сводной таблицы проб по эндпоинту с фильтрацией по тэгам (одному или нескольким) (id, timestamp, params, тэги, ссылки на просмотр тела запроса и ответа);
    • Удаления одной или нескольких проб;
    • Просмотра тел запроса и ответа пробы;
  • Устанавливаться в произвольное Rails приложение. Сделать можно, например, так:

    $ rails generate api:sampler:install