1+ from  pydantic  import  BaseModel , Field , ValidationError , StrictStr 
12import  requests 
23from  kaizen .reviewer .code_review  import  CodeReviewer 
34from  kaizen .llms .provider  import  LLMProvider 
1415}
1516
1617
18+ # Pydantic model for validating inputs 
19+ class  PRRequestModel (BaseModel ):
20+     owner : StrictStr  =  Field (..., min_length = 1 , max_length = 39 , regex = r"^[a-zA-Z0-9-]+$" )
21+     repo : StrictStr  =  Field (
22+         ..., min_length = 1 , max_length = 100 , regex = r"^[a-zA-Z0-9_.-]+$" 
23+     )
24+     pr_number : int  =  Field (..., gt = 0 )
25+ 
26+ 
27+ # Wrapper function to validate inputs 
28+ def  validate_pr_request (owner , repo , pr_number ):
29+     return  PRRequestModel (owner = owner , repo = repo , pr_number = pr_number )
30+ 
31+ 
1732def  get_pr_info (owner , repo , pr_number ):
18-     url  =  f"{ GITHUB_API }  /repos/{ owner }  /{ repo }  /pulls/{ pr_number }  " 
33+     validated_data  =  validate_pr_request (owner , repo , pr_number )
34+     url  =  f"{ GITHUB_API }  /repos/{ validated_data .owner }  /{ validated_data .repo }  /pulls/{ validated_data .pr_number }  " 
1935    response  =  requests .get (url , headers = headers )
2036    response .raise_for_status ()
2137    return  response .json ()
2238
2339
2440def  get_pr_files (owner , repo , pr_number ):
25-     url  =  f"{ GITHUB_API }  /repos/{ owner }  /{ repo }  /pulls/{ pr_number }  /files" 
41+     validated_data  =  validate_pr_request (owner , repo , pr_number )
42+     url  =  f"{ GITHUB_API }  /repos/{ validated_data .owner }  /{ validated_data .repo }  /pulls/{ validated_data .pr_number }  /files" 
2643    response  =  requests .get (url , headers = headers )
2744    response .raise_for_status ()
2845    return  response .json ()
@@ -44,6 +61,7 @@ def main(owner, repo, pr_number):
4461        print (f"\n Diff URL: { pr_info ['diff_url' ]}  " )
4562        diff_text  =  get_diff (pr_info ["diff_url" ])
4663        print (f"Diff: \n { diff_text } \n " )
64+ 
4765        code_reviewer  =  CodeReviewer (llm_provider = LLMProvider ())
4866        reviews  =  code_reviewer .review_pull_request (
4967            pull_request_title = pr_info ["title" ],
@@ -52,18 +70,17 @@ def main(owner, repo, pr_number):
5270            pull_request_files = pr_files ,
5371            user = "local_test" ,
5472        )
55-         print (json .dumps (reviews .topics , indent = 2 ))
5673
74+         print (json .dumps (reviews .topics , indent = 2 ))
5775        print ("Processing Reviews ...." )
76+ 
5877        topics  =  clean_keys (reviews .topics , "moderate" )
5978        review_desc  =  create_pr_review_text (topics )
6079        comments , topics  =  create_review_comments (topics )
6180
6281        print (f"\n  Review Desc: \n  { review_desc }  " )
63- 
6482        print (f"\n Comments: \n { json .dumps (comments )}  " )
6583
66-         print ("################### CODE DESC" )
6784        desc_generator  =  PRDescriptionGenerator (llm_provider = LLMProvider ())
6885        description  =  desc_generator .generate_pull_request_desc (
6986            pull_request_title = pr_info ["title" ],
@@ -75,12 +92,13 @@ def main(owner, repo, pr_number):
7592
7693        print ("Description: \n " , description .desc )
7794
95+     except  ValidationError  as  e :
96+         print ("Input validation error:" , e .json ())
7897    except  requests .exceptions .HTTPError  as  e :
7998        print (f"Error: { e }  " )
8099
81100
82101if  __name__  ==  "__main__" :
83102    main ("Cloud-Code-AI" , "kaizen" , 252 )
84- 
85103    print ("------------------- Multi File -------------------" )
86104    main ("Cloud-Code-AI" , "kaizen" , 222 )
0 commit comments