Skip to content

Commit e10653c

Browse files
authored
Merge pull request #119 from moevm/99-создать-методы-для-работы-get_assignee_story-в-обёртке
методы для работы get_assignee_story() в обёртке
2 parents 74da71d + d16433d commit e10653c

File tree

6 files changed

+62
-30
lines changed

6 files changed

+62
-30
lines changed

ForgejoRepoAPI.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ def get_invites(self, repo: Repository, users: list[User] = None) -> list[Invite
329329
def get_rate_limiting(self) -> tuple[int, int]:
330330
return sys.maxsize, sys.maxsize
331331

332+
def get_base_url(self) -> str:
333+
return self.client.base_url
334+
332335

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

GitHubRepoAPI.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ def get_workflow_runs(self, repo) -> list[WorkflowRun]:
267267
)
268268
return []
269269

270+
def get_base_url(self) -> str:
271+
return 'https://api.github.com'
272+
270273

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

git_logger.py

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1+
from interface_wrapper import (
2+
RepositoryFactory,
3+
IRepositoryAPI
4+
)
5+
from GitHubRepoAPI import GitHubRepoAPI
16
from 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

713
def 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

interface_wrapper.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class Repository:
6060

6161
@dataclass
6262
class Issue:
63-
_id: str
63+
_id: int
6464
title: str
6565
state: str
6666
created_at: datetime
@@ -193,6 +193,10 @@ def get_rate_limiting(self) -> tuple[int, int]:
193193
def get_workflow_runs(self, repo: Repository) -> list[WorkflowRun]:
194194
pass
195195

196+
@abstractmethod
197+
def get_base_url(self) -> str:
198+
pass
199+
196200

197201
class RepositoryFactory:
198202
@staticmethod

issues_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ def get_info(obj, attr):
205205
closer_name=issue.closed_by.username if issue.closed_by else None,
206206
closer_login=issue.closed_by.login if issue.closed_by else None,
207207
closer_email=issue.closed_by.email if issue.closed_by else None,
208-
assignee_story=get_assignee_story(issue),
208+
assignee_story=get_assignee_story(issue, client, token, repository),
209209
connected_pull_requests=(
210210
get_connected_pulls(token, issue._id, repository.owner, repository.name)
211211
if issue._id is not None

pull_requests_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def get_info(obj, attr):
150150
merger_email=pull.merged_by.email if pull.merged_by else None,
151151
source_branch=pull.head_ref,
152152
target_branch=pull.base_ref,
153-
assignee_story=get_assignee_story(pull),
153+
assignee_story=get_assignee_story(pull, client, token, repository),
154154
related_issues=(
155155
get_related_issues(pull._id, repository.owner, repository.name, token)
156156
if pull.issue_url is not None

0 commit comments

Comments
 (0)