Skip to content

Commit e1bf13c

Browse files
committed
invites and contributors fixes
1 parent 4da0363 commit e1bf13c

File tree

4 files changed

+90
-62
lines changed

4 files changed

+90
-62
lines changed

GitHubRepoAPI.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
Branch,
1010
IRepositoryAPI,
1111
User,
12-
Comment
12+
Comment,
13+
Invite
1314
)
1415
from github import Github
1516

@@ -27,15 +28,18 @@ def get_repository(self, id: str) -> Repository | None:
2728
logging.error(f"Failed to get repository {id} from GitHub: {e}")
2829
return None
2930

31+
def get_collaborator_permission(self, repo: Repository, user: User) -> str:
32+
return self.client.get_repo(repo._id).get_collaborator_permission(user.login)
33+
3034
def get_commits(self, repo: Repository) -> list[Commit]:
3135
try:
3236
commits = self.client.get_repo(repo._id).get_commits()
3337
return [
3438
Commit(
3539
_id=c.sha,
3640
message=c.commit.message,
37-
author=Contributor(
38-
c.author.login if c.author else "unknown", c.commit.author.email
41+
author=User(
42+
login=c.author.login,username=c.author.name,email=c.author.email
3943
),
4044
date=c.commit.author.date,
4145
files=[
@@ -187,6 +191,24 @@ def get_comments(self, repo, obj) -> list[Comment]:
187191

188192
return result
189193

194+
def get_invites(self, repo: Repository) -> list[Invite]:
195+
try:
196+
invites = self.client.get_repo(repo._id).get_pending_invitations()
197+
return [
198+
Invite(
199+
_id=i._id,
200+
invitee=User(login=i.invitee.login, username=i.invitee.name, email=i.invitee.email),
201+
created_at=i.created_at,
202+
html_url=i.html_url
203+
)
204+
for i in invites
205+
]
206+
except Exception as e:
207+
logging.error(
208+
f"Failed to get invites from GitHub for repo {repo.name}: {e}"
209+
)
210+
return []
211+
190212

191213
# Точка входа для тестирования
192214
if __name__ == "__main__":

contributors_parser.py

Lines changed: 7 additions & 9 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 interface_wrapper import IRepositoryAPI, Repository
4+
from interface_wrapper import IRepositoryAPI, Repository, User
55

66
EMPTY_FIELD = 'Empty field'
77
TIMEDELTA = 0.05
@@ -28,10 +28,10 @@ def log_repository_contributors(client: IRepositoryAPI, repository: Repository,
2828

2929
for contributor_stat in contributors_stats.values():
3030
contributor = contributor_stat["contributor_object"]
31-
contributor_permissons = repository.get_collaborator_permission(contributor)
31+
contributor_permissions = client.get_collaborator_permission(repository, User(login=contributor,username="",email=""))
3232

3333
info_tmp = {
34-
'repository name': repository.full_name,
34+
'repository name': repository.name,
3535
'login': contributor.login,
3636
'name': nvl(contributor.name),
3737
'email': nvl(contributor_stat['email']),
@@ -52,8 +52,6 @@ def log_repository_contributors(client: IRepositoryAPI, repository: Repository,
5252

5353
def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> dict:
5454
contributors_stats = dict()
55-
56-
# Используем обёртку для получения коммитов
5755
commits = client.get_commits(repository)
5856

5957
for commit in commits:
@@ -62,7 +60,7 @@ def get_contributors_stats(client: IRepositoryAPI, repository: Repository) -> di
6260
if not contributor.login in contributors_stats:
6361
contributors_stats[contributor.login] = {
6462
'total_commits': 0,
65-
'email': commit.commit.author.email,
63+
'email': commit.author.email,
6664
'contributor_object': contributor,
6765
}
6866

@@ -79,15 +77,15 @@ def log_contributors(
7977

8078
for repo in working_repos:
8179
try:
82-
logger.log_title(repo.full_name)
83-
log_repository_contributors(repo, csv_name)
80+
logger.log_title(repo.name)
81+
log_repository_contributors(client, repo, csv_name)
8482

8583
if fork_flag:
8684
for forked_repo in client.get_forks():
8785
logger.log_title("FORKED:", forked_repo.name)
8886
log_repository_contributors(client, forked_repo, csv_name)
8987
sleep(TIMEDELTA)
9088

91-
except e:
89+
except Exception as e:
9290
print(e)
9391
exit(1)

interface_wrapper.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class User:
2626
class Commit:
2727
_id: str
2828
message: str
29-
author: Contributor
29+
author: User
3030
date: datetime
3131
files: list[str]
3232

@@ -56,7 +56,6 @@ class Issue:
5656
closed_by: User
5757
labels: list[str]
5858
milestone: str
59-
files: list[str]
6059

6160
@dataclass
6261
class PullRequest:
@@ -75,6 +74,12 @@ class PullRequest:
7574
labels: list[str]
7675
milestone: str
7776

77+
@dataclass
78+
class Invite:
79+
_id: int
80+
invitee: User
81+
created_at: datetime
82+
html_url: str
7883

7984
@dataclass
8085
class Comment:
@@ -96,6 +101,10 @@ def get_repository(self, id: str) -> Repository | None:
96101
"""Получить репозиторий по его идентификатору."""
97102
pass
98103

104+
@abstractmethod
105+
def get_collaborator_permission(self, repo: Repository, user: User) -> str:
106+
pass
107+
99108
@abstractmethod
100109
def get_commits(self, repo: Repository) -> list[Commit]:
101110
"""Получить список коммитов для репозитория."""
@@ -134,6 +143,10 @@ def get_wiki_pages(self, repo: Repository) -> list[WikiPage]:
134143
def get_comments(self, obj) -> list[Comment]:
135144
pass
136145

146+
@abstractmethod
147+
def get_invites(self, repo: Repository) -> list[Invite]:
148+
pass
149+
137150

138151
# Фабрика для создания API
139152
class RepositoryFactory:

invites_parser.py

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,47 @@
1+
from utils import logger
12
from time import sleep
2-
from interface_wrapper import IRepositoryAPI, PullRequest, Repository
3+
from interface_wrapper import IRepositoryAPI, Repository
34

5+
FIELDNAMES = (
6+
'repository name',
7+
'invited login',
8+
'invite creation date',
9+
'invitation url',
10+
)
411
TIMEDELTA = 0.05
5-
TIMEZONE = 'Europe/Moscow'
6-
7-
def login(token):
8-
client = Github(login_or_token=token)
9-
10-
try:
11-
# Проверяем аутентификацию через оригинальный метод
12-
user_login = client.get_user().login
13-
except GithubException as err:
14-
print(f'Github: Connect: error {err.data}')
15-
print('Github: Connect: user could not be authenticated please try again.')
16-
exit(1)
17-
else:
18-
return client
19-
20-
def get_next_repo(client: IRepositoryAPI, repositories):
21-
api = GitHubRepoAPI.GitHubRepoAPI(client) # Используем обёртку
22-
with open(repositories, 'r') as file:
23-
list_repos = [x for x in file.read().split('\n') if x]
24-
print(list_repos)
25-
for repo in list_repos:
26-
try:
27-
pass
28-
except Exception as err:
29-
print(f'Github: Connect: error {err.data}')
30-
print(f'Github: Connect: failed to load repository "{repo.name}"')
31-
exit(1)
32-
else:
33-
yield repo
34-
35-
def get_assignee_story(github_object):
36-
assignee_result = ""
37-
events = (
38-
github_object.get_issue_events()
39-
if type(github_object) is PullRequest.PullRequest
40-
else github_object.get_events()
41-
)
42-
for event in events:
43-
if event.event in ["assigned", "unassigned"]:
44-
date = event.created_at
45-
assigner = github_object.user.login
46-
assignee = event.assignee.login
47-
assignee_result += f"{date}: {assigner} -"
48-
if event.event == "unassigned":
49-
assignee_result += "/"
50-
assignee_result += f"> {assignee}; "
12+
13+
14+
def log_inviter(repo, invite, writer):
15+
invite_info = [
16+
repo.full_name,
17+
invite.invitee.login,
18+
invite.created_at.strftime("%d/%m/%Y, %H:%M:%S"),
19+
invite.html_url,
20+
]
21+
writer.writerow(invite_info)
22+
print(invite_info)
23+
24+
25+
def log_repository_invitations(client: IRepositoryAPI, repository: Repository, csv_name):
26+
invitations = client.get_invites(repository)
27+
for invite in invitations:
28+
invite_info = {
29+
'repository name': repository.name,
30+
'invited login': invite.invitee.login,
31+
'invite creation date': invite.created_at.strftime("%d/%m/%Y, %H:%M:%S"),
32+
'invitation url': invite.html_url,
33+
}
34+
logger.log_to_csv(csv_name, FIELDNAMES, invite_info)
35+
logger.log_to_stdout(invite_info)
5136
sleep(TIMEDELTA)
52-
return assignee_result
37+
38+
39+
def log_invitations(client: IRepositoryAPI, working_repos, csv_name):
40+
logger.log_to_csv(csv_name, FIELDNAMES)
41+
42+
for repo in working_repos:
43+
logger.log_title(repo.name)
44+
try:
45+
log_repository_invitations(client, repo, csv_name)
46+
except Exception as e:
47+
print(e)

0 commit comments

Comments
 (0)