Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import json
- from datetime import datetime
- from collections import defaultdict
- # множество использованных файлов
- used_files = set()
- def parse_time(s):
- """парсит строку вида "2022/03/30 23:10:1" в обьект datetime"""
- return datetime.strptime(s, "%Y/%m/%d %H:%M:%S")
- def empty_developer():
- """Создает пустой объект, содержащий инфу о разработчике"""
- return {
- "changed_lines": 0,
- "commits": 0,
- "new_files": 0
- }
- def add_file(file):
- """Добавляет файл с именем file в множество добавленных файлов
- Возвращает 0, если файл уже был добавлен и 1 - в противном случае"""
- if file["name"] not in used_files:
- used_files.add(file["name"])
- return 1
- return 0
- def update_developer_info(developer, commit):
- """Обновляет информацию о разработчике на основе его коммита"""
- developer["changed_lines"] += sum(file["changed_lines"] for file in commit["files"])
- developer["commits"] += 1
- developer["new_files"] += sum([add_file(file) for file in commit["files"]])
- def add_username(name, developer):
- """Добавляет ник разработчике к инфе о нем"""
- developer["username"] = name
- return developer
- def build_developers_info(commits):
- """Генерирует информацию о разработчике на основе его коммитов (отсортированных по времени!!)"""
- developers = defaultdict(empty_developer)
- for commit in commits:
- developer_name = commit["username"]
- update_developer_info(developers[developer_name], commit)
- # т. к. до этого ник разработчика был как ключ, то добавляем его к инфе о разработчике
- return [add_username(name, developer) for name, developer in developers.items()]
- def add_row(file, row):
- """Добавляет в .tsv файл строку"""
- file.write("{}\n".format("\t".join(map(str, row))))
- def add_header(file, headers):
- """Добавляет заголовок в .tsv файл"""
- add_row(file, headers)
- def build_row(developer, headers):
- """Генерирует строку на основе информации о разработчике и списка заголовков"""
- return [developer[header] for header in headers]
- def to_tsv(filename, developers, headers):
- """Записывает информацию о разработчиках в .tsv файл"""
- file = open(filename, "w", encoding="utf-8")
- add_header(file, headers)
- # проходимся по каждому разработчику и добавляем инфу о нем в tsv файл
- for developer in developers:
- add_row(file, build_row(developer, headers))
- file.close()
- def parse_commits(file):
- """Парсинг коммитов из файла"""
- return json.load(file)
- if __name__ == "__main__":
- # открываем входной файл и парсим оттуда список коммитов
- with open("input.json", "r", encoding="utf-8") as file:
- commits = parse_commits(file)
- # сортируем коммиты по времени
- commits.sort(key=lambda commit: parse_time(commit["commit_time"]))
- # генерируем информацию о разработчиках на основе коммитов
- developers = build_developers_info(commits)
- # сортируем инфу о разработчиках по никам
- developers.sort(key=lambda developer: developer["username"])
- # билдим .tsv файл на основе инфы о разработчках
- to_tsv("output.tsv", developers, ["username", "commits", "changed_lines", "new_files"])
Add Comment
Please, Sign In to add comment