1212 Comment ,
1313 Invite ,
1414)
15- from github import Github
1615
1716
1817class GitHubRepoAPI (IRepositoryAPI ):
1918
2019 def __init__ (self , client ):
2120 self .client = client
2221
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+
2326 def get_repository (self , id : str ) -> Repository | None :
2427 try :
2528 repo = self .client .get_repo (id )
26- 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 ) )
2730 except Exception as e :
2831 logging .error (f"Failed to get repository { id } from GitHub: { e } " )
2932 return None
3033
3134 def get_collaborator_permission (self , repo : Repository , user : User ) -> str :
3235 return self .client .get_repo (repo ._id ).get_collaborator_permission (user .login )
3336
34- def get_commits (self , repo : Repository ) -> list [Commit ]:
37+ def get_commits (self , repo : Repository , files : bool = True ) -> list [Commit ]:
3538 try :
3639 commits = self .client .get_repo (repo ._id ).get_commits ()
3740 return [
3841 Commit (
3942 _id = c .sha ,
4043 message = c .commit .message ,
41- author = User (
42- login = c .author .login ,username = c .author .name ,email = c .author .email
43- ),
44+ author = self .get_user_data (c .author ),
4445 date = c .commit .author .date ,
46+ files = [
47+ f .filename
48+ for f in c .files
49+ ] if files else None
4550 )
4651 for c in commits
4752 ]
@@ -68,8 +73,17 @@ def get_issues(self, repo: Repository) -> list[Issue]:
6873 Issue (
6974 _id = i .number ,
7075 title = i .title ,
71- author = Contributor (i .user .login , i .user .email or "" ),
7276 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
7387 )
7488 for i in issues
7589 ]
@@ -84,8 +98,24 @@ def get_pull_requests(self, repo: Repository) -> list[PullRequest]:
8498 PullRequest (
8599 _id = p .number ,
86100 title = p .title ,
87- author = Contributor (p .user . login , p . user . email or "" ),
101+ author = self . get_user_data (p .user ),
88102 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
89119 )
90120 for p in pulls
91121 ]
@@ -128,15 +158,47 @@ def get_branches(self, repo: Repository) -> list[Branch]:
128158 return []
129159
130160 def get_wiki_pages (self , repo : Repository ) -> list [WikiPage ]:
131- 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
132194
133195 def get_invites (self , repo : Repository ) -> list [Invite ]:
134196 try :
135197 invites = self .client .get_repo (repo ._id ).get_pending_invitations ()
136198 return [
137199 Invite (
138200 _id = i ._id ,
139- invitee = User ( login = i .invitee . login , username = i . invitee . name , email = i . invitee . email ),
201+ invitee = self . get_user_data ( i .invitee ),
140202 created_at = i .created_at ,
141203 html_url = i .html_url
142204 )
@@ -148,7 +210,6 @@ def get_invites(self, repo: Repository) -> list[Invite]:
148210 )
149211 return []
150212
151-
152213# Точка входа для тестирования
153214if __name__ == "__main__" :
154215 # Создайте клиент GitHub (используйте ваш токен)
0 commit comments