Skip to content

Commit 395df6b

Browse files
authored
contributors parser implimented (#85)
1 parent b7ae2a5 commit 395df6b

File tree

4 files changed

+114
-2
lines changed

4 files changed

+114
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__pycache__

contributors_parser.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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)

git_logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def login(token):
1313
except GithubException as err:
1414
print(f'Github: Connect: error {err.data}')
1515
print('Github: Connect: user could not be authenticated please try again.')
16-
raise exit(1)
16+
exit(1)
1717
else:
1818
return client
1919

main.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import issues_parser
1010
import invites_parser
1111
import wikipars
12+
import contributors_parser
13+
1214

1315

1416
def parse_args():
@@ -20,6 +22,7 @@ def parse_args():
2022
)
2123
parser.add_argument("-i", "--issues", help="log issues", action="store_true")
2224
parser.add_argument("-w", "--wikis", help="log wikis", action="store_true")
25+
parser.add_argument("--contributors", help="log contributors", action="store_true")
2326
parser.add_argument(
2427
"--forks_include", help="logging data from forks", action="store_true"
2528
)
@@ -130,7 +133,6 @@ def main():
130133
path_drepo = args.download_repos
131134
fork_flag = args.forks_include
132135
log_pr_comments = args.pr_comments
133-
start, finish = None, None
134136

135137
try:
136138
client = git_logger.login(token=token)
@@ -165,6 +167,10 @@ def main():
165167
invites_parser.log_invitations(client, working_repos, csv_name)
166168
if args.wikis:
167169
wikipars.wikiparser(client, repositories, path_drepo, csv_name)
170+
if args.contributors:
171+
contributors_parser.log_contributors(
172+
client, working_repos, csv_name, fork_flag
173+
)
168174
if args.export_google_sheets:
169175
export_sheets.write_data_to_table(
170176
csv_name, args.google_token, args.table_id, args.sheet_id

0 commit comments

Comments
 (0)