Будучи тимлидом команды разработки, вы получили от менеджера проекта задачу повысить скорость разработки. Звучит, как начало плохого анекдота, но, тем не менее, решение вам все же нужно найти. В ходе размышлений и изучений различного внешнего опыта других команд разработки вы решили попробовать инструменты геймификации. То есть применить техники и подходы игрового характера с целью повышения вовлеченности команды в решение задач.
Вами была придумана рейтинговая таблица самых активных контрибьютеров за спринт. Что это значит в теории: по окончании итерации (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
Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение.
Пугаева Алина Михайловна
Реализация задания состоит из трёх основных функций:
- read_commits()
- find_top(commits_dict)
- write_winners(winners)
Сначала функция read_commits() построчно считывает файл с данными (commits.txt). Для каждой строки проводится проверка правильности полученных данных с помощью функции check_line(line). Она, в свою очередь, проверяет соответствие формата полученной строки заданному (“<Имя пользователя> <Сокращенный хэш коммита> <Дата и время коммита>”), а после, используя функции check_name(user_name), check_hash(commit_hash), check_date(commit_date), проверяется правильность имени пользователя, хэша коммита и даты и времени коммита в соответствии с требованиями, указанными выше, в README.md. Проверки осуществляются с помощью регулярных выражений и модуля datetime. Если запись удовлетворяет всем условиям, имя пользователя добавляется в словарь, который хранит пары {имя пользователя : множество хэшей коммитов, сделанных пользователем}. Множество хэшей коммитов хранится для того, чтобы при подсчёте количества коммитов, сделанных пользователем, учитывать только уникальные. Если запись не прошла все проверки, данные, связанные с ней, не добавляются в словарь.
Далее функция find_top(commits_dict) принимает словарь {Имя пользователя : количество сделанных коммитов} (изменяем словарь, полученный из read_commits() с помощью функции map) и сортирует его по значениям в порядке убывания. Из полученного нового словаря собирается список из 3-х первых имён (то есть, сюда попадают имена тех, кто сделал больше всего коммитов).
Функция write_winners(winners) записывает в файл result.txt имена 3-х самых активных пользователей, полученные списком из функции find_top(commits_dict), по одному в каждой строке в порядке убывания места в рейтинге. Если список победителей winners пуст, то в result.txt записывается строка "NO WINNERS".
Перед запуском решения необходимо убедиться, что в папке проекта находится файл commits.txt.
При условии, что мы находимся в директории school2024-test-task4, в консоли пишем:
python3 main.py
Если мы находимся в другой директории, после python3
указывается весь путь до файла main.py.
Результат выполнения хранится в файле result.txt.
Если не установлен python, то его нужно установить перед запуском.