forked from croc-code/school2024-test-task4
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
87 lines (78 loc) · 3.97 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import re
from datetime import datetime
'''
Проверяет считанное имя пользователя на соответствие требованиям:
латинские символы в любом регистре, цифры (но не в начале строки), а также символ "_".
Фунция принимает строку, которую необходимо проверить, возвращает булевое значение
'''
def check_name(user_name):
return re.fullmatch(r'^(?!^\d)[a-zA-Z0-9_]+$', user_name)
'''
Проверяет считанный хэш коммита на соответствие требованиям:
строка в нижнем регистре, состоящая из 7 символов: букв латинского алфавита, а также цифр
Фунция принимает строку, которую необходимо проверить, возвращает булевое значение
'''
def check_hash(commit_hash):
return re.fullmatch(r'^[a-z0-9]{7}$', commit_hash)
'''
Проверяет считанные дату и время коммита на соответствие формату YYYY-MM-ddTHH:mm:ss
Фунция принимает строку, которую необходимо проверить, возвращает булевое значение
'''
def check_date(commit_date):
try:
datetime.strptime(commit_date, '%Y-%m-%dT%H:%M:%S.%f')
return True
except ValueError:
return False
'''
Проверяет данные в считанной строке на соответствие требованиям
Принимает строку, возвращает кортеж (имя пользователя, хэш коммита) или False
'''
def check_line(line):
if len(line.split()) != 3:
return False
user_name, commit_hash, commit_date = line.split()
if check_name(user_name) and check_hash(commit_hash) and check_date(commit_date):
return (user_name, commit_hash)
return False
'''
Считывает файл с данными о коммитах
Проверяет правильность полученных данных
Формирует словарь с именами пользователей и количеством совершённых ими коммитов за период
Возвращает этот словарь
'''
def read_commits():
dev_names = {}
with open('commits.txt', 'r') as f:
for line in f:
user_name_hash = check_line(line)
if user_name_hash:
if user_name_hash[0] not in dev_names:
dev_names[user_name_hash[0]] = set()
dev_names[user_name_hash[0]].add(user_name_hash[1])
else:
print(f'Invalid data: {line}')
return dev_names
'''
Находит 3 самых активных пользователей
Принимает словарь {Имя пользователя : количество сделанных коммитов}
Возвращает список из 3 пользователей, сделавших больше всего коммитов (в порядке убывания места в рейтинге)
'''
def find_top(commits_dict):
sorted_contributors = sorted(commits_dict.items(), key=lambda x: x[1], reverse=True)
return list(map(lambda x: x[0], sorted_contributors))[:3]
'''
Записывает именах 3-х самых активных пользователей в файл result.txt
Принимает список с 3-мя пользователями
'''
def write_winners(winners):
with open('result.txt', 'w') as f:
f.write(str('\n'.join(winners)))
if len(winners) == 0:
f.write("NO WINNERS")
def main():
commits_dict = read_commits()
winners = find_top({key:len(value) for (key,value) in commits_dict.items()})
write_winners(winners)
if __name__ == '__main__':
main()