Skip to content

Commit 4da0363

Browse files
committed
github api fixes
1 parent 92a1906 commit 4da0363

File tree

8 files changed

+225
-168
lines changed

8 files changed

+225
-168
lines changed

GitHubRepoAPI.py

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
WikiPage,
99
Branch,
1010
IRepositoryAPI,
11+
User,
12+
Comment
1113
)
1214
from github import Github
1315

1416

1517
class GitHubRepoAPI(IRepositoryAPI):
1618

1719
def __init__(self, client):
18-
self.client = client
20+
self.client = Github(client)
1921

2022
def get_repository(self, id: str) -> Repository | None:
2123
try:
2224
repo = self.client.get_repo(id)
23-
return Repository(_id=repo.full_name, name=repo.name, url=repo.html_url)
25+
return Repository(_id=repo.full_name, name=repo.name, url=repo.html_url, default_branch=Branch(name=repo.default_branch, last_commit=None), owner=User(login=repo.owner.login,username=repo.owner.name,email=repo.owner.email))
2426
except Exception as e:
2527
logging.error(f"Failed to get repository {id} from GitHub: {e}")
2628
return None
@@ -36,6 +38,10 @@ def get_commits(self, repo: Repository) -> list[Commit]:
3638
c.author.login if c.author else "unknown", c.commit.author.email
3739
),
3840
date=c.commit.author.date,
41+
files=[
42+
f.filename
43+
for f in c.files
44+
]
3945
)
4046
for c in commits
4147
]
@@ -62,8 +68,17 @@ def get_issues(self, repo: Repository) -> list[Issue]:
6268
Issue(
6369
_id=i.number,
6470
title=i.title,
65-
author=Contributor(i.user.login, i.user.email or ""),
6671
state=i.state,
72+
created_at=i.created_at,
73+
closed_at=i.closed_at,
74+
closed_by=User(login=i.closed_by.login,username=i.closed_by.name,email=i.closed_by.email) if i.closed_by else None,
75+
body=i.body,
76+
user=User(login=i.user.login,username=i.user.name,email=i.user.email),
77+
labels= [
78+
l.name
79+
for l in i.labels
80+
],
81+
milestone=i.milestone.title if i.milestone else None
6782
)
6883
for i in issues
6984
]
@@ -78,8 +93,24 @@ def get_pull_requests(self, repo: Repository) -> list[PullRequest]:
7893
PullRequest(
7994
_id=p.number,
8095
title=p.title,
81-
author=Contributor(p.user.login, p.user.email or ""),
96+
author=User(login=p.user.login, username=p.user.name, email=p.user.email),
8297
state=p.state,
98+
created_at=p.created_at,
99+
head_label=p.head.label,
100+
base_label=p.base.label,
101+
head_ref=p.head.ref,
102+
base_ref=p.base.ref,
103+
merged_by=User(login=p.merged_by.login, username=p.merged_by.name, email=p.merged_by.email) if p.merged_by else None,
104+
files=[
105+
f.filename
106+
for f in p.get_files()
107+
],
108+
issue_url=p.issue_url,
109+
labels= [
110+
l.name
111+
for l in p.labels
112+
],
113+
milestone=p.milestone.title if p.milestone else None
83114
)
84115
for p in pulls
85116
]
@@ -122,7 +153,39 @@ def get_branches(self, repo: Repository) -> list[Branch]:
122153
return []
123154

124155
def get_wiki_pages(self, repo: Repository) -> list[WikiPage]:
125-
pass
156+
return
157+
158+
def get_forks(self, repo: Repository) -> list[Repository]:
159+
repo_client = self.client.get_repo(repo._id)
160+
result = []
161+
for r in repo_client.get_forks():
162+
result.append(Repository(_id=repo.full_name, name=repo.name, url=repo.html_url))
163+
return result
164+
165+
def get_comments(self, repo, obj) -> list[Comment]:
166+
result = []
167+
if type(obj) == Issue:
168+
# TODO оптимизировать
169+
issues = self.client.get_repo(repo._id).get_issues(state='all')
170+
issue = None
171+
for i in issues:
172+
if i.number == obj._id:
173+
issue = i
174+
break
175+
for c in issue.get_comments():
176+
result.append(Comment(body=c.body,created_at=c.created_at,author=User(login=c.user.login,username=c.user.name,email=c.user.email)))
177+
elif type(obj) == PullRequest:
178+
# TODO оптимизировать
179+
pulls = self.client.get_repo(repo._id).get_pulls(state='all')
180+
pull = None
181+
for p in pulls:
182+
if p.number == obj._id:
183+
pull = p
184+
break
185+
for c in pull.get_comments():
186+
result.append(Comment(body=c.body,created_at=c.created_at,author=User(login=c.user.login,username=c.user.name,email=c.user.email)))
187+
188+
return result
126189

127190

128191
# Точка входа для тестирования

commits_parser.py

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from utils import logger
22
import pytz
33
from time import sleep
4-
from github import Github, Repository
5-
import GitHubRepoAPI # Импортируем обёртку
4+
from interface_wrapper import IRepositoryAPI
65

76
EMPTY_FIELD = 'Empty field'
87
TIMEDELTA = 0.05
@@ -18,12 +17,11 @@
1817
'branch',
1918
)
2019

21-
def log_repository_commits(client: Github, repository, csv_name, start, finish, branch):
20+
def log_repository_commits(client: IRepositoryAPI, repository, csv_name, start, finish, branch):
2221
branches = []
2322
match branch:
2423
case 'all':
25-
api = GitHubRepoAPI.GitHubRepoAPI(client)
26-
branches = api.get_branches(repository)
24+
branches = client.get_branches(repository)
2725
for branch in branches:
2826
branches.append(branch.name)
2927
case None:
@@ -34,20 +32,19 @@ def log_repository_commits(client: Github, repository, csv_name, start, finish,
3432
for branch in branches:
3533
print(f'Processing branch {branch}')
3634
# Используем обёртку для получения коммитов
37-
api = GitHubRepoAPI.GitHubRepoAPI(client)
38-
commits = api.get_commits(repository)
35+
commits = client.get_commits(repository)
3936
for commit in commits:
4037
if (
4138
commit.date.astimezone(pytz.timezone(TIMEZONE)) < start
4239
or commit.date.astimezone(pytz.timezone(TIMEZONE)) > finish
4340
):
4441
continue
4542
commit_data = [
46-
repository.full_name,
43+
repository.name,
4744
commit.author.username,
4845
commit.author.email or EMPTY_FIELD,
4946
commit.date,
50-
'; '.join([file.filename for file in commit.files]),
47+
'; '.join([file for file in commit.files]),
5148
commit._id,
5249
branch,
5350
]
@@ -59,27 +56,19 @@ def log_repository_commits(client: Github, repository, csv_name, start, finish,
5956
sleep(TIMEDELTA)
6057

6158
def log_commits(
62-
client, working_repos, csv_name, start, finish, branch, fork_flag
59+
client: IRepositoryAPI, working_repos, csv_name, start, finish, branch, fork_flag
6360
):
6461
logger.log_to_csv(csv_name, FIELDNAMES)
6562

66-
api = GitHubRepoAPI.GitHubRepoAPI(client) # Используем обёртку
67-
68-
for repo_name in working_repos:
63+
for repo in working_repos:
6964
try:
70-
# Получаем репозиторий через обёртку
71-
repo = api.get_repository(repo_name)
72-
if not repo:
73-
print(f"Repository {repo_name} not found or access denied.")
74-
continue
75-
7665
logger.log_title(repo.name)
77-
log_repository_commits(repo, csv_name, start, finish, branch)
66+
log_repository_commits(client, repo, csv_name, start, finish, branch)
7867
if fork_flag:
79-
# Получаем форки через оригинальный метод, так как его нет в обёртке(Нужно добавить)
80-
forked_repos = client.get_repo(repo._id).get_forks()
68+
# TODO
69+
forked_repos = client.get_forks(repo)
8170
for forked_repo in forked_repos:
82-
logger.log_title("FORKED:", forked_repo.full_name)
71+
logger.log_title("FORKED:", forked_repo.name)
8372
log_repository_commits(forked_repo, csv_name, start, finish, branch)
8473
sleep(TIMEDELTA)
8574
sleep(TIMEDELTA)

contributors_parser.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from utils import logger
22
from time import sleep
33
from typing import Generator
4-
from github import Github, Repository, GithubException
5-
import GitHubRepoAPI # Импортируем обёртку
4+
from interface_wrapper import IRepositoryAPI, Repository
65

76
EMPTY_FIELD = 'Empty field'
87
TIMEDELTA = 0.05
@@ -22,15 +21,13 @@
2221
'site_admin',
2322
)
2423

25-
def log_repository_contributors(repository: Repository, csv_name: str):
26-
#Нужно добавить
27-
contributors_stats = get_contributors_stats(repository)
24+
def log_repository_contributors(client: IRepositoryAPI, repository: Repository, csv_name: str):
25+
contributors_stats = get_contributors_stats(client, repository)
2826

2927
nvl = lambda val: val or EMPTY_FIELD
3028

3129
for contributor_stat in contributors_stats.values():
3230
contributor = contributor_stat["contributor_object"]
33-
#Нужно добавить
3431
contributor_permissons = repository.get_collaborator_permission(contributor)
3532

3633
info_tmp = {
@@ -53,12 +50,11 @@ def log_repository_contributors(repository: Repository, csv_name: str):
5350

5451
sleep(TIMEDELTA)
5552

56-
def get_contributors_stats(repository: Repository) -> dict:
53+
def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> dict:
5754
contributors_stats = dict()
5855

5956
# Используем обёртку для получения коммитов
60-
api = GitHubRepoAPI.GitHubRepoAPI(repository._github)
61-
commits = api.get_commits(repository)
57+
commits = client.get_commits(repository)
6258

6359
for commit in commits:
6460
contributor = commit.author
@@ -77,24 +73,21 @@ def get_contributors_stats(repository: Repository) -> dict:
7773
return contributors_stats
7874

7975
def log_contributors(
80-
client: Github, working_repos: Generator, csv_name: str, fork_flag: bool
76+
client: IRepositoryAPI, working_repos: Generator, csv_name: str, fork_flag: bool
8177
):
8278
logger.log_to_csv(csv_name, FIELDNAMES)
8379

84-
api = GitHubRepoAPI.GitHubRepoAPI(client) # Используем обёртку
85-
8680
for repo in working_repos:
8781
try:
8882
logger.log_title(repo.full_name)
8983
log_repository_contributors(repo, csv_name)
9084

9185
if fork_flag:
92-
#Нужно добавить
93-
for forked_repo in repo.get_forks():
94-
logger.log_title("FORKED:", forked_repo.full_name)
95-
log_repository_contributors(forked_repo, csv_name)
86+
for forked_repo in client.get_forks():
87+
logger.log_title("FORKED:", forked_repo.name)
88+
log_repository_contributors(client, forked_repo, csv_name)
9689
sleep(TIMEDELTA)
9790

98-
except GithubException as e:
91+
except e:
9992
print(e)
100-
exit(1)
93+
exit(1)

git_logger.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,40 @@
11
from time import sleep
2-
from github import Github, GithubException, PullRequest
3-
import GitHubRepoAPI # Импортируем обёртку
2+
from interface_wrapper import IRepositoryAPI, RepositoryFactory
43

54
TIMEDELTA = 0.05
65
TIMEZONE = 'Europe/Moscow'
76

87
def login(token):
9-
client = Github(login_or_token=token)
10-
118
try:
12-
# Проверяем аутентификацию через оригинальный метод(Нужно добавить)
13-
user_login = client.get_user().login
14-
except GithubException as err:
15-
print(f'Github: Connect: error {err.data}')
9+
client = RepositoryFactory.create_api("github", token)
10+
except Exception as err:
11+
print(f'Github: Connect: error {err}')
1612
print('Github: Connect: user could not be authenticated please try again.')
1713
exit(1)
1814
else:
1915
return client
2016

21-
def get_next_repo(client: Github, repositories):
22-
api = GitHubRepoAPI.GitHubRepoAPI(client) # Используем обёртку
17+
def get_next_repo(client: IRepositoryAPI, repositories):
2318
with open(repositories, 'r') as file:
2419
list_repos = [x for x in file.read().split('\n') if x]
2520
print(list_repos)
2621
for repo_name in list_repos:
2722
try:
28-
# Получаем репозиторий через обёртку
29-
repo = api.get_repository(repo_name)
23+
repo = client.get_repository(repo_name)
3024
if not repo:
31-
raise GithubException(status=404, data={"message": f"Repository {repo_name} not found."})
32-
except GithubException as err:
33-
print(f'Github: Connect: error {err.data}')
25+
raise Exception(f"Repository {repo_name} not found.")
26+
except Exception as err:
27+
print(f'Github: Connect: error {err}')
3428
print(f'Github: Connect: failed to load repository "{repo_name}"')
3529
exit(1)
3630
else:
3731
yield repo
3832

3933
def get_assignee_story(github_object):
34+
#TODO
35+
return ""
4036
assignee_result = ""
4137
events = (
42-
#Нужно добавить
4338
github_object.get_issue_events()
4439
if type(github_object) is PullRequest.PullRequest
4540
else github_object.get_events()
@@ -54,4 +49,4 @@ def get_assignee_story(github_object):
5449
assignee_result += "/"
5550
assignee_result += f"> {assignee}; "
5651
sleep(TIMEDELTA)
57-
return assignee_result
52+
return assignee_result

0 commit comments

Comments
 (0)