Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CROC_test_task #36

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,22 @@ CodeKiller777
Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение.

## Автор решения
Ларин Анатолий Николаевич

[Я в Telegram](https://t.me/centner_cents)

## Описание реализации
Решение содержится в main.py
1. При запуске файла main.py, вызывается автоматическая процедура create_result_file, в которую передается файл commits.txt(Важно, чтобы файл commits.txt находился в той же директории, что и исполняемый файл main.py)
2. В процедуре create_resilt_file вызывается функция get_data для формирования словаря из подходящих для этого данных.
3. Далее вызывается функция для формирования списка пользователей которые вошли в топ-3 по количеству коммитов.
4. Процедура create_result_file заканчивает свое выполнение созданием файла result.txt, в который записываются результаты полученные выше.

В данном решении обработаны некоторые исключения, при обработке которых программа выведет предположительное сообщение в консоль.

## Инструкция по сборке и запуску решения
1. Перенести файлы с удаленного репозитория на локальный.
2. Убедиться в том, что в папке с файлом main.py находится commits.txt с входными данными.
3. Открыть командную строку или любую среду разработки для работы с «Python»: «PyCharm», «Visual Studio», «IDLE» и тд.
4. Запустить файл основого решения main.py
5. В результате получаем файл result.txt с выходными данными в исходной папке где лежит main.py и файл с входными данными.
1 change: 1 addition & 0 deletions commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
AIvanov 25ec001 2024-05-11T13:56:39.492
90 changes: 90 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import os
from datetime import date, timedelta, datetime


#функция для проверки корректности имени пользователя
def checking_username(username:str)->bool:
if username[0].isdigit() or not all(char.isalnum() or char == "_" for char in username):
return False
return True


#функия для проверки корректности хэша коммита
def checking_hash(hash:str)->bool:
if hash.isalnum() and len(hash)==7:
return True
return False


#функия для проверки, что коммит сделан в течении 4 недель
def checking_date(date_commit:str, days_ago:int = 28)->bool:
temp = date_commit.split('T')
temp = datetime.strptime(temp[0],"%Y-%m-%d").date()
date_today = date.today()
four_week = timedelta(days_ago)
if date_today-four_week<=temp<date_today:
return True
return False


#функция которая получает список имен пользователей входящих в топ-3
def get_top3(dict_info:dict[str,int])->list[str]:
dict_sorted = dict(sorted(dict_info.items(), key=lambda item: item[1], reverse=True))
keys = list(dict_sorted.keys())
i =0
count = 0
names_winners = []
flg_divide = False
while i<len(dict_sorted)-1 and (count<3 or flg_divide):
names_winners.append(keys[i])
if dict_sorted[keys[i]]==dict_sorted[keys[i+1]]:
flg_divide = True
else:
flg_divide = False
i+=1
count+=1

if flg_divide or count<3:
names_winners.append(keys[-1])

return names_winners


#функция, которая из полученных данных из файла возвращает словарь, соответствующий требованиям,
#где ключ это имя пользователя, а значение количество коммитов
def get_data(file):
dict_info = {}
info_commit = file.readline()
while info_commit:
temp = info_commit.split()
if len(temp)==3:
if checking_username(temp[0]) and checking_hash(temp[1]) and checking_date(temp[2]):
if temp[0] not in dict_info:
dict_info[temp[0]]=1
else:
dict_info[temp[0]]+=1
info_commit = file.readline()

return dict_info

#процедура, которая создает файл "result.txt" со списком имен
def create_result_file(file):
dict_info = get_data(file)
if dict_info:
names_winners = get_top3(dict_info)
with open("result.txt","w+") as res_file:
for i in names_winners:
res_file.write(i+"\n")
else:
print("Файл с коммитами пуст или коммиты не соответствуют требованиям.")
with open("result.txt", "w") as res_file:
pass
return


if __name__ == "__main__":
if "commits.txt" in os.listdir():
with open("commits.txt", "r") as file:
create_result_file(file)
else:
print("Файл commits.txt не найден")