88 WikiPage ,
99 Branch ,
1010 IRepositoryAPI ,
11+ User ,
12+ Comment ,
13+ Invite ,
1114)
12- from github import Github
1315
1416
1517class GitHubRepoAPI (IRepositoryAPI ):
1618
1719 def __init__ (self , client ):
1820 self .client = client
1921
22+ def get_user_data (self , user ) -> User :
23+ return User (login = user .login , username = user .name , email = user .email , html_url = user .html_url , node_id = user .node_id , type = user .type , bio = user .bio , site_admin = user .site_admin , _id = user .id )
24+
25+
2026 def get_repository (self , id : str ) -> Repository | None :
2127 try :
2228 repo = self .client .get_repo (id )
23- return Repository (_id = repo .full_name , name = repo .name , url = repo .html_url )
29+ 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 , html_url = repo . owner . html_url ) )
2430 except Exception as e :
2531 logging .error (f"Failed to get repository { id } from GitHub: { e } " )
2632 return None
2733
28- def get_commits (self , repo : Repository ) -> list [Commit ]:
34+ def get_collaborator_permission (self , repo : Repository , user : User ) -> str :
35+ return self .client .get_repo (repo ._id ).get_collaborator_permission (user .login )
36+
37+ def get_commits (self , repo : Repository , files : bool = True ) -> list [Commit ]:
2938 try :
3039 commits = self .client .get_repo (repo ._id ).get_commits ()
3140 return [
3241 Commit (
3342 _id = c .sha ,
3443 message = c .commit .message ,
35- author = Contributor (
36- c .author .login if c .author else "unknown" , c .commit .author .email
37- ),
44+ author = self .get_user_data (c .author ),
3845 date = c .commit .author .date ,
46+ files = [
47+ f .filename
48+ for f in c .files
49+ ] if files else None
3950 )
4051 for c in commits
4152 ]
@@ -62,8 +73,17 @@ def get_issues(self, repo: Repository) -> list[Issue]:
6273 Issue (
6374 _id = i .number ,
6475 title = i .title ,
65- author = Contributor (i .user .login , i .user .email or "" ),
6676 state = i .state ,
77+ created_at = i .created_at ,
78+ closed_at = i .closed_at ,
79+ closed_by = self .get_user_data (i .closed_by ) if i .closed_by else None ,
80+ body = i .body ,
81+ user = self .get_user_data (i .user ),
82+ labels = [
83+ l .name
84+ for l in i .labels
85+ ],
86+ milestone = i .milestone .title if i .milestone else None
6787 )
6888 for i in issues
6989 ]
@@ -78,8 +98,24 @@ def get_pull_requests(self, repo: Repository) -> list[PullRequest]:
7898 PullRequest (
7999 _id = p .number ,
80100 title = p .title ,
81- author = Contributor (p .user . login , p . user . email or "" ),
101+ author = self . get_user_data (p .user ),
82102 state = p .state ,
103+ created_at = p .created_at ,
104+ head_label = p .head .label ,
105+ base_label = p .base .label ,
106+ head_ref = p .head .ref ,
107+ base_ref = p .base .ref ,
108+ merged_by = self .get_user_data (p .merged_by ) if p .merged_by else None ,
109+ files = [
110+ f .filename
111+ for f in p .get_files ()
112+ ],
113+ issue_url = p .issue_url ,
114+ labels = [
115+ l .name
116+ for l in p .labels
117+ ],
118+ milestone = p .milestone .title if p .milestone else None
83119 )
84120 for p in pulls
85121 ]
@@ -122,8 +158,57 @@ def get_branches(self, repo: Repository) -> list[Branch]:
122158 return []
123159
124160 def get_wiki_pages (self , repo : Repository ) -> list [WikiPage ]:
125- pass
161+ return
162+
163+ def get_forks (self , repo : Repository ) -> list [Repository ]:
164+ repo_client = self .client .get_repo (repo ._id )
165+ result = []
166+ for r in repo_client .get_forks ():
167+ result .append (Repository (_id = repo .full_name , name = repo .name , url = repo .html_url ))
168+ return result
169+
170+ def get_comments (self , repo , obj ) -> list [Comment ]:
171+ result = []
172+ if type (obj ) == Issue :
173+ # TODO оптимизировать
174+ issues = self .client .get_repo (repo ._id ).get_issues (state = 'all' )
175+ issue = None
176+ for i in issues :
177+ if i .number == obj ._id :
178+ issue = i
179+ break
180+ for c in issue .get_comments ():
181+ result .append (Comment (body = c .body ,created_at = c .created_at ,author = self .get_user_data (c .user )))
182+ elif type (obj ) == PullRequest :
183+ # TODO оптимизировать
184+ pulls = self .client .get_repo (repo ._id ).get_pulls (state = 'all' )
185+ pull = None
186+ for p in pulls :
187+ if p .number == obj ._id :
188+ pull = p
189+ break
190+ for c in pull .get_comments ():
191+ result .append (Comment (body = c .body ,created_at = c .created_at ,author = self .get_user_data (c .user .login )))
192+
193+ return result
126194
195+ def get_invites (self , repo : Repository ) -> list [Invite ]:
196+ try :
197+ invites = self .client .get_repo (repo ._id ).get_pending_invitations ()
198+ return [
199+ Invite (
200+ _id = i ._id ,
201+ invitee = self .get_user_data (i .invitee ),
202+ created_at = i .created_at ,
203+ html_url = i .html_url
204+ )
205+ for i in invites
206+ ]
207+ except Exception as e :
208+ logging .error (
209+ f"Failed to get invites from GitHub for repo { repo .name } : { e } "
210+ )
211+ return []
127212
128213# Точка входа для тестирования
129214if __name__ == "__main__" :
0 commit comments