@@ -202,9 +202,39 @@ def unassign_issue(self, owner: str, repo: str, issue_number: int, assignee: str
202202 return False
203203
204204 def request_review (self , repo : str , pr_number : int , reviewer : str ) -> None :
205+ """Request a review on a pull request from the given reviewer (GitHub login)."""
206+ owner = self ._org
205207 self ._logger .info (
206- "GitHub review request stub" ,
207- extra = {"repo" : repo , "pr_number" : pr_number , "reviewer" : reviewer },
208+ "Requesting PR review" ,
209+ extra = {"owner" : owner , "repo" : repo , "pr_number" : pr_number , "reviewer" : reviewer },
210+ )
211+ path = f"/repos/{ owner } /{ repo } /pulls/{ pr_number } /requested_reviewers"
212+ payload = {"reviewers" : [reviewer ]}
213+ try :
214+ response = self ._client .post (path , json = payload )
215+ except httpx .HTTPError as exc :
216+ self ._logger .warning (
217+ "GitHub review request failed (network)" ,
218+ extra = {"path" : path , "error" : str (exc )},
219+ )
220+ return
221+ if response .status_code in {200 , 201 }:
222+ self ._logger .info (
223+ "PR review requested successfully" ,
224+ extra = {"owner" : owner , "repo" : repo , "pr_number" : pr_number , "reviewer" : reviewer },
225+ )
226+ return
227+ error_body = (response .text or "" )[:500 ]
228+ self ._logger .warning (
229+ "GitHub review request failed (API)" ,
230+ extra = {
231+ "owner" : owner ,
232+ "repo" : repo ,
233+ "pr_number" : pr_number ,
234+ "reviewer" : reviewer ,
235+ "status_code" : response .status_code ,
236+ "error_response" : error_body ,
237+ },
208238 )
209239
210240 def get_pull_request (self , owner : str , repo : str , pr_number : int ) -> dict | None :
0 commit comments