Будучи тимлидом команды разработки, вы получили от менеджера проекта задачу повысить скорость разработки. Звучит, как начало плохого анекдота, но, тем не менее, решение вам все же нужно найти. В ходе размышлений и изучений различного внешнего опыта других команд разработки вы решили попробовать инструменты геймификации. То есть применить техники и подходы игрового характера с целью повышения вовлеченности команды в решение задач.
Вами была придумана рейтинговая таблица самых активных контрибьютеров за спринт. Что это значит в теории: по окончании итерации (4 рабочие недели) выгружается список коммитов, сделанных в релизную ветку продукта, и на его основе вычисляются трое самых активных разработчиков, сделавших наибольшее количество коммитов. В зависимости от занятого места, разработчик получает определенное количество внутренней валюты вашей компании, которую он впоследствии может обменять на какие-то товары из внутреннего магазина.
На практике вы видите решение следующим образом: на следующий день после окончания спринта в 00:00 запускается автоматическая процедура, которая забирает файл с данными о коммитах в релизную ветку, сделанных в период спринта, после чего выполняется поиск 3-х самых активных контрибьютеров. Имена найденных разработчиков записываются в файл, который впоследствии отправляется вам на почту.
В рамках практической реализации данной задачи вам необходимо разработать процедуру формирование отчета “Топ-3 контрибьютера”. Данная процедура принимает на вход текстовый файл (commits.txt), содержащий данные о коммитах (построчно). Каждая строка содержит сведения о коммите в релизную ветку в формате: “<Имя пользователя> <Сокращенный хэш коммита> <Дата и время коммита>”. Например: AIvanov 25ec001 2024-04-24T13:56:39.492
К данным предъявляются следующие требования:
- имя пользователя может содержать латинские символы в любом регистре, цифры (но не начинаться с них), а также символ "_";
- сокращенный хэш коммита представляет из себя строку в нижнем регистре, состояющую из 7 символов: букв латинского алфавита, а также цифр;
- дата и время коммита в формате YYYY-MM-ddTHH:mm:ss.
В результате работы процедура формирует новый файл (result.txt), содержащий информацию об именах 3-х самых активных пользователей по одному в каждой строке в порядке убывания места в рейтинге. Пример содержимого файла: AIvanov AKalinina CodeKiller777
Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение.
Telegram: @Impactor3
Почта: [email protected]
Буду очень рад обратной связи по тестовому заданию
.
├── CMakeLists.txt
├── README.md
├── Resources - файлы для I/O
├── cmake-build-debug
├── config - конфиги(в данном случае 1 файл хранящий пути для файлов commits.txt и result.txt)
└── src - исходные файлы с кодом
Для гибкой реализации поставленной задачи было принято решение реализовать 4 класса, каждый из которых отвечает за отдельный функционал:
- ConfigHandler - парсит файл из заданному пути(в данном случае config/config.json), в котором описаны пути до файлов commits.txt и result.txt
- Commit - абстракция над коммитом. Хранит автора, хэш и время создания коммита.
- CommitParser - Парсит переданный файл с коммитами. Он же выполняет валидацию входных данных. Результатом является мапа с информацией о валидных коммитах.
- TopContributors - Обрабатывает результат работы CommitParser и записывает результат в файл в заданном формате.
Для повышения надёжности работы утилиты и во избежание получения на выходе неожиданных результатов, было принято решение производить валидацию каждой записи о коммите, а именно:
- Проверяется на соответсвие формату юзернейм автора, хэш коммита и время создание коммита
- Для времени учтено 2 возможных формата: YYYY-MM-ddTHH:mm:ss и YYYY-MM-DDThh:mm:ss[.SSS] - с милесекундами и без
- Проверяется "свежесть" коммита - действительно ли он был сделан во время последнего спринта.
- Все ошибки, возникающие в процессе работы программы, а также сообщения о невалидности того или иного коммита или записи о нём в файле
логируются и выводятся в консоль
Чтобы сделать утилиту более гибкой было принято решение реализовать возможность задавать некоторые параметры через конструкторы классов, что позволяет не затрагивая исходную реализацию классов менять настройки утилиты под нужое поведение
Возможности:
- Задание кастомного числа "призовых мест" в конструкторе TopContributors, то есть числа лучших контрибьютеров, чьи юзернеймы будут записаны в файл, как лучших за прошедший спринт
- Задание кастомной продолжительности спринта в днях(0 - 365) вторым параметром в конструкторе CommitParser. По умолчанию 28
- Задание своего пути до файла с конфигами в конструкторе ConfigHandler
- Задание пути(и имени) до файлов commits.txt и result.txt - откуда будут считываться данные и куда будет записан результат работы программы
Необходимые зависимости:
- Git (чтобы склонировать репозиторий)
- Компилятор языка C++20 и выше (например gcc или clang)
- cmake(для сборки)
Порядок действий:
-
В терминале перейти в папку, куда нужно будет разместить проект
-
Использовать команду:
git clone [email protected]:Benzogang-Tape/school2024-test-task7.git
чтобы склонировать репозиторий на локальную машину
-
Перейти в папку проекта:
cd school2024-test-task7
-
- Создать папку для сборки
- перейти в неё
- сгенерировать файлы сборки с помощью cmake
mkdir cmake-build-debug cd cmake-build-debug cmake ..
[!NOTE]
С помощью флага-DCMAKE_BUILD_TYPE=
можно установить тип сборки (Release или Debug) -
Выполнить команду make для сборки проекта
make
После чего создастся исполняемый файл, готовый к запуску
[!TIP]
Если собрать проект командойmake
не получилось, используйте командуcmake --build .
-
Запуск программы
./school2024_test_task7
-
Просмотр результатов
cd ../Resources cat result.txt