AlexG2230954

Untitled

Jun 10th, 2022 (edited)
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.92 KB | None | 0 0
  1. import json
  2. from datetime import datetime
  3. from collections import defaultdict
  4.  
  5. # множество использованных файлов
  6. used_files = set()
  7.  
  8.  
  9. def parse_time(s):
  10.     """парсит строку вида "2022/03/30 23:10:1" в обьект datetime"""
  11.     return datetime.strptime(s, "%Y/%m/%d %H:%M:%S")
  12.  
  13.  
  14. def empty_developer():
  15.     """Создает пустой объект, содержащий инфу о разработчике"""
  16.     return {
  17.         "changed_lines": 0,
  18.         "commits": 0,
  19.         "new_files": 0
  20.     }
  21.  
  22.  
  23. def add_file(file):
  24.     """Добавляет файл с именем file в множество добавленных файлов
  25.    Возвращает 0, если файл уже был добавлен и 1 - в противном случае"""
  26.     if file["name"] not in used_files:
  27.         used_files.add(file["name"])
  28.         return 1
  29.  
  30.     return 0
  31.  
  32.  
  33. def update_developer_info(developer, commit):
  34.     """Обновляет информацию о разработчике на основе его коммита"""
  35.     developer["changed_lines"] += sum(file["changed_lines"] for file in commit["files"])
  36.     developer["commits"] += 1
  37.     developer["new_files"] += sum([add_file(file) for file in commit["files"]])
  38.  
  39.  
  40. def add_username(name, developer):
  41.     """Добавляет ник разработчике к инфе о нем"""
  42.     developer["username"] = name
  43.     return developer
  44.  
  45.  
  46. def build_developers_info(commits):
  47.     """Генерирует информацию о разработчике на основе его коммитов (отсортированных по времени!!)"""
  48.     developers = defaultdict(empty_developer)
  49.  
  50.     for commit in commits:
  51.         developer_name = commit["username"]
  52.         update_developer_info(developers[developer_name], commit)
  53.  
  54.     # т. к. до этого ник разработчика был как ключ, то добавляем его к инфе о разработчике
  55.     return [add_username(name, developer) for name, developer in developers.items()]
  56.  
  57.  
  58. def add_row(file, row):
  59.     """Добавляет в .tsv файл строку"""
  60.     file.write("{}\n".format("\t".join(map(str, row))))
  61.  
  62.  
  63. def add_header(file, headers):
  64.     """Добавляет заголовок в .tsv файл"""
  65.     add_row(file, headers)
  66.  
  67.  
  68. def build_row(developer, headers):
  69.     """Генерирует строку на основе информации о разработчике и списка заголовков"""
  70.     return [developer[header] for header in headers]
  71.  
  72.  
  73. def to_tsv(filename, developers, headers):
  74.     """Записывает информацию о разработчиках в .tsv файл"""
  75.     file = open(filename, "w", encoding="utf-8")
  76.     add_header(file, headers)
  77.  
  78.     # проходимся по каждому разработчику и добавляем инфу о нем в tsv файл
  79.     for developer in developers:
  80.         add_row(file, build_row(developer, headers))
  81.  
  82.     file.close()
  83.  
  84.  
  85. def parse_commits(file):
  86.     """Парсинг коммитов из файла"""
  87.     return json.load(file)
  88.  
  89.  
  90. if __name__ == "__main__":
  91.     # открываем входной файл и парсим оттуда список коммитов
  92.     with open("input.json", "r", encoding="utf-8") as file:
  93.         commits = parse_commits(file)
  94.  
  95.     # сортируем коммиты по времени
  96.     commits.sort(key=lambda commit: parse_time(commit["commit_time"]))
  97.    
  98.     # генерируем информацию о разработчиках на основе коммитов
  99.     developers = build_developers_info(commits)
  100.    
  101.     # сортируем инфу о разработчиках по никам
  102.     developers.sort(key=lambda developer: developer["username"])
  103.    
  104.     # билдим .tsv файл на основе инфы о разработчках
  105.     to_tsv("output.tsv", developers, ["username", "commits", "changed_lines", "new_files"])
Add Comment
Please, Sign In to add comment