1+ from interface_wrapper import (
2+ RepositoryFactory ,
3+ IRepositoryAPI
4+ )
5+ from GitHubRepoAPI import GitHubRepoAPI
16from time import sleep
7+ import requests
28
3- from constants import TIMEDELTA
4- from interface_wrapper import IRepositoryAPI , RepositoryFactory
9+ TIMEDELTA = 0.05
10+ TIMEZONE = 'Europe/Moscow'
511
612
713def login (token , base_url ):
@@ -53,7 +59,6 @@ def _get_next_client(self) -> tuple[IRepositoryAPI, str]:
5359
5460 if client is None :
5561 raise Exception ("No git clients available" )
56-
5762 return client , self .token_map [client ]
5863
5964 def get_next_client (self ) -> tuple [IRepositoryAPI , str ]:
@@ -66,31 +71,48 @@ def get_next_binded_repo(clients: Clients, repositories: list[str]):
6671 client , token = clients .get_next_client ()
6772 repo = client .get_repository (repo_name )
6873 except Exception as err :
69- print (f'get_next_repo(): error { err } ' )
70- print (f'get_next_repo(): failed to load repository "{ repo_name } "' )
71- exit (1 )
74+ print (f'get_next_binded_repo(): error { err } ' )
75+ print (f'get_next_binded_repo(): failed to load repository "{ repo_name } "' )
7276 else :
7377 yield client , repo , token
7478
7579
76- def get_assignee_story (git_object ):
77- # TODO
78- return ""
79-
80- '''assignee_result = ""
81- events = (
82- git_object.get_issue_events()
83- if type(github_object) is PullRequest.PullRequest
84- else github_object.get_events()
85- )
86- for event in events:
87- if event.event in ["assigned", "unassigned"]:
88- date = event.created_at
89- assigner = github_object.user.login
90- assignee = event.assignee.login
91- assignee_result += f"{date}: {assigner} -"
92- if event.event == "unassigned":
93- assignee_result += "/"
94- assignee_result += f"> {assignee}; "
95- sleep(TIMEDELTA)
96- return assignee_result'''
80+ def get_assignee_story (git_object , client , token , repository ):
81+ assignee_result = ""
82+
83+ try :
84+ repo_owner = repository .owner .login
85+ repo_name = repository .name
86+ issue_index = git_object ._id # Для pull request и issue одинаково
87+
88+ base_url = client .get_base_url ().rstrip ('/' )
89+
90+ url = f"{ base_url } /repos/{ repo_owner } /{ repo_name } /issues/{ issue_index } /timeline"
91+ headers = {
92+ "Authorization" : f"Bearer { token } " if client is GitHubRepoAPI else f"token { token } " ,
93+ "Accept" : "application/json"
94+ }
95+
96+ response = requests .get (url , headers = headers )
97+ if response .status_code != 200 :
98+ raise Exception (f"Failed to fetch issue timeline: { response .status_code } , { response .text } " )
99+
100+ events = response .json ()
101+
102+ for event in events :
103+ if event .get ('event' ) in ["assigned" , "unassigned" ]:
104+ date = event .get ('created_at' )
105+ assigner = event .get ('actor' , {}).get ('login' , 'unknown' )
106+ assignee = event .get ('assignee' , {}).get ('login' , 'unknown' )
107+
108+ assignee_result += f"{ date } : { assigner } -"
109+ if event ['event' ] == "unassigned" :
110+ assignee_result += "/"
111+ assignee_result += f"> { assignee } ; "
112+
113+ sleep (TIMEDELTA )
114+
115+ except Exception as e :
116+ print (f"get_assignee_story(): error { e } " )
117+
118+ return assignee_result
0 commit comments