Skip to content

Commit f343475

Browse files
authored
Merge pull request #88 from moevm/79-Calls-changed
79 changed calls
2 parents abd2124 + 4da0363 commit f343475

File tree

9 files changed

+290
-183
lines changed

9 files changed

+290
-183
lines changed

.DS_Store

6 KB
Binary file not shown.

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: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from utils import logger
22
import pytz
33
from time import sleep
4-
from github import Github, Repository, GithubException, PullRequest
4+
from interface_wrapper import IRepositoryAPI
55

66
EMPTY_FIELD = 'Empty field'
77
TIMEDELTA = 0.05
@@ -17,12 +17,12 @@
1717
'branch',
1818
)
1919

20-
21-
def log_repository_commits(repository: 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-
for branch in repository.get_branches():
24+
branches = client.get_branches(repository)
25+
for branch in branches:
2626
branches.append(branch.name)
2727
case None:
2828
branches.append(repository.default_branch)
@@ -31,46 +31,44 @@ def log_repository_commits(repository: Repository, csv_name, start, finish, bran
3131

3232
for branch in branches:
3333
print(f'Processing branch {branch}')
34-
# TODO add support of since and until in https://pygithub.readthedocs.io/en/stable/github_objects/Repository.html#github.Repository.Repository.get_commits
35-
for commit in repository.get_commits(sha=branch):
34+
# Используем обёртку для получения коммитов
35+
commits = client.get_commits(repository)
36+
for commit in commits:
3637
if (
37-
commit.commit.author.date.astimezone(pytz.timezone(TIMEZONE)) < start
38-
or commit.commit.author.date.astimezone(pytz.timezone(TIMEZONE))
39-
> finish
38+
commit.date.astimezone(pytz.timezone(TIMEZONE)) < start
39+
or commit.date.astimezone(pytz.timezone(TIMEZONE)) > finish
4040
):
4141
continue
42-
if commit.commit is not None:
43-
nvl = lambda val: val or EMPTY_FIELD
44-
commit_data = [
45-
repository.full_name,
46-
commit.commit.author.name,
47-
nvl(commit.author.login if commit.author else None),
48-
nvl(commit.commit.author.email),
49-
commit.commit.author.date,
50-
'; '.join([file.filename for file in commit.files]),
51-
commit.commit.sha,
52-
branch,
53-
]
54-
info = dict(zip(FIELDNAMES, commit_data))
55-
56-
logger.log_to_csv(csv_name, FIELDNAMES, info)
57-
logger.log_to_stdout(info)
42+
commit_data = [
43+
repository.name,
44+
commit.author.username,
45+
commit.author.email or EMPTY_FIELD,
46+
commit.date,
47+
'; '.join([file for file in commit.files]),
48+
commit._id,
49+
branch,
50+
]
51+
info = dict(zip(FIELDNAMES, commit_data))
5852

59-
sleep(TIMEDELTA)
53+
logger.log_to_csv(csv_name, FIELDNAMES, info)
54+
logger.log_to_stdout(info)
6055

56+
sleep(TIMEDELTA)
6157

6258
def log_commits(
63-
client: Github, working_repos, csv_name, start, finish, branch, fork_flag
59+
client: IRepositoryAPI, working_repos, csv_name, start, finish, branch, fork_flag
6460
):
6561
logger.log_to_csv(csv_name, FIELDNAMES)
6662

6763
for repo in working_repos:
6864
try:
69-
logger.log_title(repo.full_name)
70-
log_repository_commits(repo, csv_name, start, finish, branch)
65+
logger.log_title(repo.name)
66+
log_repository_commits(client, repo, csv_name, start, finish, branch)
7167
if fork_flag:
72-
for forked_repo in repo.get_forks():
73-
logger.log_title("FORKED:", forked_repo.full_name)
68+
# TODO
69+
forked_repos = client.get_forks(repo)
70+
for forked_repo in forked_repos:
71+
logger.log_title("FORKED:", forked_repo.name)
7472
log_repository_commits(forked_repo, csv_name, start, finish, branch)
7573
sleep(TIMEDELTA)
7674
sleep(TIMEDELTA)

contributors_parser.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from utils import logger
22
from time import sleep
33
from typing import Generator
4-
from github import Github, Repository, GithubException
4+
from interface_wrapper import IRepositoryAPI, Repository
55

66
EMPTY_FIELD = 'Empty field'
77
TIMEDELTA = 0.05
@@ -21,9 +21,8 @@
2121
'site_admin',
2222
)
2323

24-
25-
def log_repository_contributors(repository: Repository, csv_name: str):
26-
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)
2726

2827
nvl = lambda val: val or EMPTY_FIELD
2928

@@ -51,11 +50,13 @@ def log_repository_contributors(repository: Repository, csv_name: str):
5150

5251
sleep(TIMEDELTA)
5352

54-
55-
def get_contributors_stats(repository: Repository) -> dict:
53+
def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> dict:
5654
contributors_stats = dict()
5755

58-
for commit in repository.get_commits():
56+
# Используем обёртку для получения коммитов
57+
commits = client.get_commits(repository)
58+
59+
for commit in commits:
5960
contributor = commit.author
6061

6162
if not contributor.login in contributors_stats:
@@ -71,9 +72,8 @@ def get_contributors_stats(repository: Repository) -> dict:
7172

7273
return contributors_stats
7374

74-
7575
def log_contributors(
76-
client: Github, working_repos: Generator, csv_name: str, fork_flag: bool
76+
client: IRepositoryAPI, working_repos: Generator, csv_name: str, fork_flag: bool
7777
):
7878
logger.log_to_csv(csv_name, FIELDNAMES)
7979

@@ -83,11 +83,11 @@ def log_contributors(
8383
log_repository_contributors(repo, csv_name)
8484

8585
if fork_flag:
86-
for forked_repo in repo.get_forks():
87-
logger.log_title("FORKED:", forked_repo.full_name)
88-
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)
8989
sleep(TIMEDELTA)
9090

91-
except GithubException as e:
91+
except e:
9292
print(e)
9393
exit(1)

git_logger.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,38 @@
1-
from github import Github, GithubException, PullRequest
21
from time import sleep
2+
from interface_wrapper import IRepositoryAPI, RepositoryFactory
33

44
TIMEDELTA = 0.05
55
TIMEZONE = 'Europe/Moscow'
66

7-
87
def login(token):
9-
client = Github(login_or_token=token)
10-
118
try:
12-
client.get_user().login
13-
except GithubException as err:
14-
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}')
1512
print('Github: Connect: user could not be authenticated please try again.')
1613
exit(1)
1714
else:
1815
return client
1916

20-
21-
def get_next_repo(client: Github, repositories):
17+
def get_next_repo(client: IRepositoryAPI, repositories):
2218
with open(repositories, 'r') as file:
2319
list_repos = [x for x in file.read().split('\n') if x]
2420
print(list_repos)
2521
for repo_name in list_repos:
2622
try:
27-
repo = client.get_repo(repo_name)
28-
except GithubException as err:
29-
print(f'Github: Connect: error {err.data}')
23+
repo = client.get_repository(repo_name)
24+
if not repo:
25+
raise Exception(f"Repository {repo_name} not found.")
26+
except Exception as err:
27+
print(f'Github: Connect: error {err}')
3028
print(f'Github: Connect: failed to load repository "{repo_name}"')
3129
exit(1)
3230
else:
3331
yield repo
3432

35-
3633
def get_assignee_story(github_object):
34+
#TODO
35+
return ""
3736
assignee_result = ""
3837
events = (
3938
github_object.get_issue_events()

0 commit comments

Comments
 (0)