1
+ from pydantic import BaseModel , Field , ValidationError , StrictStr
1
2
import requests
2
3
from kaizen .reviewer .code_review import CodeReviewer
3
4
from kaizen .llms .provider import LLMProvider
14
15
}
15
16
16
17
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
+
17
32
def 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 } "
19
35
response = requests .get (url , headers = headers )
20
36
response .raise_for_status ()
21
37
return response .json ()
22
38
23
39
24
40
def 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"
26
43
response = requests .get (url , headers = headers )
27
44
response .raise_for_status ()
28
45
return response .json ()
@@ -44,6 +61,7 @@ def main(owner, repo, pr_number):
44
61
print (f"\n Diff URL: { pr_info ['diff_url' ]} " )
45
62
diff_text = get_diff (pr_info ["diff_url" ])
46
63
print (f"Diff: \n { diff_text } \n " )
64
+
47
65
code_reviewer = CodeReviewer (llm_provider = LLMProvider ())
48
66
reviews = code_reviewer .review_pull_request (
49
67
pull_request_title = pr_info ["title" ],
@@ -52,18 +70,17 @@ def main(owner, repo, pr_number):
52
70
pull_request_files = pr_files ,
53
71
user = "local_test" ,
54
72
)
55
- print (json .dumps (reviews .topics , indent = 2 ))
56
73
74
+ print (json .dumps (reviews .topics , indent = 2 ))
57
75
print ("Processing Reviews ...." )
76
+
58
77
topics = clean_keys (reviews .topics , "moderate" )
59
78
review_desc = create_pr_review_text (topics )
60
79
comments , topics = create_review_comments (topics )
61
80
62
81
print (f"\n Review Desc: \n { review_desc } " )
63
-
64
82
print (f"\n Comments: \n { json .dumps (comments )} " )
65
83
66
- print ("################### CODE DESC" )
67
84
desc_generator = PRDescriptionGenerator (llm_provider = LLMProvider ())
68
85
description = desc_generator .generate_pull_request_desc (
69
86
pull_request_title = pr_info ["title" ],
@@ -75,12 +92,13 @@ def main(owner, repo, pr_number):
75
92
76
93
print ("Description: \n " , description .desc )
77
94
95
+ except ValidationError as e :
96
+ print ("Input validation error:" , e .json ())
78
97
except requests .exceptions .HTTPError as e :
79
98
print (f"Error: { e } " )
80
99
81
100
82
101
if __name__ == "__main__" :
83
102
main ("Cloud-Code-AI" , "kaizen" , 252 )
84
-
85
103
print ("------------------- Multi File -------------------" )
86
104
main ("Cloud-Code-AI" , "kaizen" , 222 )
0 commit comments