|
| 1 | +import csv |
| 2 | +from time import sleep |
| 3 | +from typing import Generator |
| 4 | +from github import Github, Repository, GithubException |
| 5 | + |
| 6 | +EMPTY_FIELD = 'Empty field' |
| 7 | +TIMEDELTA = 0.05 |
| 8 | +TIMEZONE = 'Europe/Moscow' |
| 9 | +FIELDNAMES = ( |
| 10 | + 'repository name', |
| 11 | + 'login', |
| 12 | + 'name', |
| 13 | + 'email', |
| 14 | + 'url', |
| 15 | + 'permissions', |
| 16 | + 'total_commits', |
| 17 | + 'id', |
| 18 | + 'node_id', |
| 19 | + 'type', |
| 20 | + 'bio', |
| 21 | + 'site_admin', |
| 22 | +) |
| 23 | + |
| 24 | + |
| 25 | +def log_contributors_to_csv(info: dict, csv_name: str): |
| 26 | + with open(csv_name, 'a', newline='') as file: |
| 27 | + writer = csv.DictWriter(file, fieldnames=FIELDNAMES) |
| 28 | + writer.writerow(info) |
| 29 | + |
| 30 | + |
| 31 | +def log_contributors_to_stdout(info: dict): |
| 32 | + print(info) |
| 33 | + |
| 34 | + |
| 35 | +def log_repository_contributors(repository: Repository, csv_name: str): |
| 36 | + contributors_stats = get_contributors_stats(repository) |
| 37 | + |
| 38 | + nvl = lambda val: val or EMPTY_FIELD |
| 39 | + |
| 40 | + for contributor_stat in contributors_stats.values(): |
| 41 | + contributor = contributor_stat["contributor_object"] |
| 42 | + contributor_permissons = repository.get_collaborator_permission(contributor) |
| 43 | + |
| 44 | + info_tmp = { |
| 45 | + 'repository name': repository.full_name, |
| 46 | + 'login': contributor.login, |
| 47 | + 'name': nvl(contributor.name), |
| 48 | + 'email': nvl(contributor_stat['email']), |
| 49 | + 'url': contributor.html_url, |
| 50 | + 'permissions': nvl(contributor_permissons), |
| 51 | + 'total_commits': contributor_stat['total_commits'], |
| 52 | + 'id': contributor.id, |
| 53 | + 'node_id': contributor.node_id, |
| 54 | + 'type': contributor.type, |
| 55 | + 'bio': nvl(contributor.bio), |
| 56 | + 'site_admin': contributor.site_admin, |
| 57 | + } |
| 58 | + |
| 59 | + log_contributors_to_csv(info_tmp, csv_name) |
| 60 | + log_contributors_to_stdout(info_tmp) |
| 61 | + |
| 62 | + sleep(TIMEDELTA) |
| 63 | + |
| 64 | + |
| 65 | +def get_contributors_stats(repository: Repository) -> dict: |
| 66 | + contributors_stats = dict() |
| 67 | + |
| 68 | + for commit in repository.get_commits(): |
| 69 | + contributor = commit.author |
| 70 | + |
| 71 | + if not contributor.login in contributors_stats: |
| 72 | + contributors_stats[contributor.login] = { |
| 73 | + 'total_commits': 0, |
| 74 | + 'email': commit.commit.author.email, |
| 75 | + 'contributor_object': contributor, |
| 76 | + } |
| 77 | + |
| 78 | + contributors_stats[contributor.login]['total_commits'] += 1 |
| 79 | + |
| 80 | + sleep(TIMEDELTA) |
| 81 | + |
| 82 | + return contributors_stats |
| 83 | + |
| 84 | + |
| 85 | +def log_contributors( |
| 86 | + client: Github, working_repos: Generator, csv_name: str, fork_flag: bool |
| 87 | +): |
| 88 | + with open(csv_name, 'w', newline='') as file: |
| 89 | + writer = csv.writer(file) |
| 90 | + writer.writerow(FIELDNAMES) |
| 91 | + |
| 92 | + for repo in working_repos: |
| 93 | + try: |
| 94 | + print('=' * 20, repo.full_name, '=' * 20) |
| 95 | + log_repository_contributors(repo, csv_name) |
| 96 | + |
| 97 | + if fork_flag: |
| 98 | + for forked_repo in repo.get_forks(): |
| 99 | + print('=' * 20, "FORKED:", forked_repo.full_name, '=' * 20) |
| 100 | + log_repository_contributors(forked_repo, csv_name) |
| 101 | + sleep(TIMEDELTA) |
| 102 | + |
| 103 | + except GithubException as e: |
| 104 | + print(e) |
| 105 | + exit(1) |
0 commit comments