55
66from src .common .tools .review_pull_request import ReviewPullRequest
77from src .config import config
8- from src .reviews .dto . responses import PRReviewResponse
8+ from src .reviews .constants import ReviewStatus
99from src .reviews .models .pull_requests import FileReview , PullRequestFileChanges
10- from src .utils . http import send_http_post_request
10+ from src .utils import api
1111
1212logger = logging .getLogger (__name__ )
1313
@@ -20,35 +20,51 @@ async def create_review_from_file_diffs(
2020 """Create a pull request review from file diffs."""
2121 semaphore = asyncio .Semaphore (config .modules .reviews .max_concurrent_file_reviews )
2222
23+ total_files = len (file_diffs )
24+ reviewed_files = 0
25+
2326 review_tasks = [
2427 _review_file_diff (file_diff = file_diff , semaphore = semaphore )
2528 for file_diff in file_diffs
2629 ]
27- review_contents = await asyncio .gather (* review_tasks )
28- file_names = [review .filename for review in file_diffs ]
29- patches = [review .patch for review in file_diffs ]
30+ review_per_file : dict [str , str ] = {}
31+ for task in asyncio .as_completed (review_tasks ):
32+ review_per_file |= await task
33+
34+ reviewed_files += 1
35+ progress_value = int ((reviewed_files / total_files ) * 100 )
36+ await api .update_progress (
37+ review_status_id ,
38+ progress_value ,
39+ ReviewStatus .processing ,
40+ )
3041
31- review = PRReviewResponse (
42+ patches_per_file = {file_diff .filename : file_diff .patch for file_diff in file_diffs }
43+
44+ file_reviews = [
45+ FileReview (
46+ filename = filename ,
47+ content = content ,
48+ patch = patches_per_file .get (filename , "" ),
49+ )
50+ for filename , content in review_per_file .items ()
51+ ]
52+ await api .complete_review (
3253 review_id = review_id ,
3354 review_status_id = review_status_id ,
34- file_reviews = [
35- FileReview (filename = filename , content = content , patch = patch )
36- for filename , content , patch in zip (file_names , review_contents , patches )
37- ],
55+ file_reviews = file_reviews ,
3856 )
39- url = f"{ config .approved_api_url } /reviews/complete"
40- await send_http_post_request (content = review .model_dump (), url = url )
4157
4258
4359async def _review_file_diff (
4460 file_diff : PullRequestFileChanges ,
4561 semaphore : asyncio .Semaphore ,
46- ) -> str :
62+ ) -> dict [ str , str ] :
4763 """Create a review task for a single file.
4864
4965 :param file_changes: The pull request file changes.
5066 :param semaphore: The semaphore.
51- :return: The review content.
67+ :return: A mapping from the file name to the review content.
5268 """
5369 answer = ""
5470 async with semaphore :
@@ -57,4 +73,4 @@ async def _review_file_diff(
5773 async for review_content in review_content_iterator :
5874 answer += review_content
5975
60- return answer
76+ return { file_diff . filename : answer }
0 commit comments