added more features
Browse files- app.py +17 -3
- gemini.py +7 -3
- handler.py +54 -11
- prompts.py +118 -24
app.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import streamlit as st
|
|
|
|
| 2 |
from handler import *
|
| 3 |
|
| 4 |
def main():
|
|
@@ -18,16 +19,29 @@ def main():
|
|
| 18 |
with col2:
|
| 19 |
# Radio buttons for analysis type
|
| 20 |
analysis_type = st.radio("Choose analysis type:",
|
| 21 |
-
("Code review", "Code refinement", "Unit tests"))
|
| 22 |
|
| 23 |
# Submit button
|
| 24 |
if st.button("Submit"):
|
| 25 |
# Process the code and prompt based on analysis_type (implementation omitted for brevity)
|
| 26 |
if analysis_type == "Code review":
|
| 27 |
-
res=
|
| 28 |
#st.text_area(label="Result",value=res, height=300)
|
| 29 |
st.markdown(res)
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
if __name__ == "__main__":
|
| 33 |
main()
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
+
import time
|
| 3 |
from handler import *
|
| 4 |
|
| 5 |
def main():
|
|
|
|
| 19 |
with col2:
|
| 20 |
# Radio buttons for analysis type
|
| 21 |
analysis_type = st.radio("Choose analysis type:",
|
| 22 |
+
("Code review", "Code refinement","Documentation", "Unit tests"))
|
| 23 |
|
| 24 |
# Submit button
|
| 25 |
if st.button("Submit"):
|
| 26 |
# Process the code and prompt based on analysis_type (implementation omitted for brevity)
|
| 27 |
if analysis_type == "Code review":
|
| 28 |
+
res=review_code(code, prompt)
|
| 29 |
#st.text_area(label="Result",value=res, height=300)
|
| 30 |
st.markdown(res)
|
| 31 |
+
time.sleep(1)
|
| 32 |
+
#st.markdown("Hello ooo")
|
| 33 |
+
|
| 34 |
+
elif analysis_type == "Code refinement":
|
| 35 |
+
res=refine_code(code, prompt)
|
| 36 |
+
#st.text_area(label="Result",value=res, height=300)
|
| 37 |
+
st.markdown(res)
|
| 38 |
+
|
| 39 |
+
elif analysis_type == "Documentation":
|
| 40 |
+
res=generate_documentation(code, prompt)
|
| 41 |
+
#st.text_area(label="Result",value=res, height=300)
|
| 42 |
+
st.markdown(res)
|
| 43 |
+
|
| 44 |
+
st.success(f"Code analysis for {analysis_type} submitted successfully!")
|
| 45 |
|
| 46 |
if __name__ == "__main__":
|
| 47 |
main()
|
gemini.py
CHANGED
|
@@ -7,8 +7,8 @@ generation_config=genai.types.GenerationConfig(
|
|
| 7 |
# Only one candidate for now.
|
| 8 |
#candidate_count=1,
|
| 9 |
#stop_sequences=['x'],
|
| 10 |
-
|
| 11 |
-
temperature=
|
| 12 |
)
|
| 13 |
class GeminiModel:
|
| 14 |
"""
|
|
@@ -35,7 +35,11 @@ class GeminiModel:
|
|
| 35 |
def execute(self, prompt: str) -> str:
|
| 36 |
|
| 37 |
try:
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
return response.text
|
| 40 |
except Exception as e:
|
| 41 |
return f"An error occurred: {e}"
|
|
|
|
| 7 |
# Only one candidate for now.
|
| 8 |
#candidate_count=1,
|
| 9 |
#stop_sequences=['x'],
|
| 10 |
+
max_output_tokens=4096,
|
| 11 |
+
temperature=0.1
|
| 12 |
)
|
| 13 |
class GeminiModel:
|
| 14 |
"""
|
|
|
|
| 35 |
def execute(self, prompt: str) -> str:
|
| 36 |
|
| 37 |
try:
|
| 38 |
+
total_tokens = self.model.count_tokens(prompt).total_tokens
|
| 39 |
+
print(f"Input tokens: {total_tokens}")
|
| 40 |
+
response = self.model.generate_content(prompt, generation_config=generation_config)
|
| 41 |
+
output_tokens = self.model.count_tokens(response.text).total_tokens
|
| 42 |
+
print(f"Output tokens: {output_tokens}")
|
| 43 |
return response.text
|
| 44 |
except Exception as e:
|
| 45 |
return f"An error occurred: {e}"
|
handler.py
CHANGED
|
@@ -1,19 +1,62 @@
|
|
| 1 |
-
|
| 2 |
from prompts import *
|
| 3 |
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
| 7 |
-
if code is None or len(code)< 5 or code.isspace():
|
| 8 |
-
return "No Code Provided"
|
| 9 |
-
|
| 10 |
if c_prompt is not None and len(c_prompt) > 30:
|
| 11 |
-
prompt=
|
| 12 |
else:
|
| 13 |
-
prompt=
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
model=GeminiModel()
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
return res
|
|
|
|
|
|
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gemini
|
| 2 |
from prompts import *
|
| 3 |
|
| 4 |
+
def review_code(code, c_prompt=None):
|
| 5 |
+
if code is None or len(code) < 5 or code.isspace():
|
| 6 |
+
raise InvalidCodeException("No code provided")
|
| 7 |
|
| 8 |
+
if c_prompt is not None and len(c_prompt) > 30:
|
| 9 |
+
prompt = custom_review_prompt(code.strip(), c_prompt.strip())
|
| 10 |
+
else:
|
| 11 |
+
#prompt = validation_prompt(code.strip())
|
| 12 |
+
prompt = default_review_prompt1(code.strip())
|
| 13 |
+
|
| 14 |
+
model = gemini.GeminiModel()
|
| 15 |
+
try:
|
| 16 |
+
res = model.execute(prompt)
|
| 17 |
+
except Exception as e:
|
| 18 |
+
raise CodeReviewException(str(e))
|
| 19 |
+
|
| 20 |
+
return res
|
| 21 |
+
|
| 22 |
+
def refine_code(code, c_prompt=None):
|
| 23 |
+
if code is None or len(code) < 5 or code.isspace():
|
| 24 |
+
raise InvalidCodeException("No code provided")
|
| 25 |
|
|
|
|
|
|
|
|
|
|
| 26 |
if c_prompt is not None and len(c_prompt) > 30:
|
| 27 |
+
prompt = custom_review_prompt(code.strip(), c_prompt.strip())
|
| 28 |
else:
|
| 29 |
+
#prompt = validation_prompt(code.strip())
|
| 30 |
+
prompt = default_refine_prompt(code.strip())
|
| 31 |
+
|
| 32 |
+
model = gemini.GeminiModel()
|
| 33 |
+
try:
|
| 34 |
+
res = model.execute(prompt)
|
| 35 |
+
except Exception as e:
|
| 36 |
+
raise CodeReviewException(str(e))
|
| 37 |
+
|
| 38 |
return res
|
| 39 |
+
|
| 40 |
+
def generate_documentation(code,c_prompt):
|
| 41 |
|
| 42 |
+
if code is None or len(code) < 5 or code.isspace():
|
| 43 |
+
raise InvalidCodeException("No code provided")
|
| 44 |
+
|
| 45 |
+
if c_prompt is not None and len(c_prompt) > 30:
|
| 46 |
+
prompt = custom_review_prompt(code.strip(), c_prompt.strip())
|
| 47 |
+
else:
|
| 48 |
+
prompt = default_doc_prompt(code.strip())
|
| 49 |
+
|
| 50 |
+
model = gemini.GeminiModel()
|
| 51 |
+
try:
|
| 52 |
+
res = model.execute(prompt)
|
| 53 |
+
except Exception as e:
|
| 54 |
+
raise CodeReviewException(str(e))
|
| 55 |
+
|
| 56 |
+
return res
|
| 57 |
+
|
| 58 |
+
class InvalidCodeException(Exception):
|
| 59 |
+
pass
|
| 60 |
+
|
| 61 |
+
class CodeReviewException(Exception):
|
| 62 |
+
pass
|
prompts.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
| 1 |
-
|
| 2 |
-
|
|
|
|
|
|
|
| 3 |
Avoid verbosity and repetition in your feedback, focussing on essential points and offering valuable suggestions.
|
| 4 |
Add your own observations and suggestions as needed, and only include comments that are neccessary for clarity and improvement.
|
| 5 |
If you have specific code suggestions, ensure they are correct and aligned with the best practices.
|
|
@@ -33,18 +35,18 @@ Race conditions have been handled
|
|
| 33 |
Locks are acquired and released in the right order to prevent deadlocks, even in error handling code.
|
| 34 |
All methods are commented in clear language
|
| 35 |
"""
|
| 36 |
-
|
| 37 |
STEPS="""Follow the steps in the same order:
|
| 38 |
1. Understand the code logic and structure.
|
| 39 |
-
2. Notedown the observations based on the
|
| 40 |
3. Give suggestions for improving the code.
|
| 41 |
4. Give an example of Final improved code.
|
| 42 |
"""
|
| 43 |
|
| 44 |
-
def
|
| 45 |
if guidelines is None:
|
| 46 |
guidelines=GUIDELINES
|
| 47 |
-
prompt=f"""<Task>: {TASK}
|
| 48 |
<Instructions>: {INSTRUCTIONS}
|
| 49 |
|
| 50 |
<Guidelines>: {guidelines}
|
|
@@ -57,34 +59,126 @@ def default_gemini_prompt(code, guidelines=None):
|
|
| 57 |
return prompt
|
| 58 |
|
| 59 |
|
| 60 |
-
def
|
| 61 |
-
prompt=f"""
|
| 62 |
-
<task>: As an experienced software developer responsible for code review and feedback, review the following code by considering the best practices given in the guidelines below and provide your Observations and Suggestions
|
| 63 |
-
Code: {code}
|
| 64 |
|
| 65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
-
{GUIDELINES}
|
| 68 |
|
| 69 |
-
|
| 70 |
|
| 71 |
-
|
|
|
|
| 72 |
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
* If there are any violations of the custom guidelines.
|
| 77 |
|
| 78 |
-
Break down your review into a step-by-step process, explaining your reasoning at each point. Maintain a clear and concise tone throughout the review.
|
| 79 |
-
Add your own observations and suggestions as needed, and only include comments that are neccessary for clarity and improvement.
|
| 80 |
-
If you have specific code suggestions, ensure they are correct and aligned with the best practices
|
| 81 |
|
| 82 |
-
**Overall Recommendation:**
|
| 83 |
|
| 84 |
-
|
| 85 |
"""
|
| 86 |
|
| 87 |
return prompt
|
| 88 |
|
| 89 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
return f'{c_prompt}\n<Code>: {code}'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
ROLE="You are an experienced python software developer responsible for code review and feedback."
|
| 2 |
+
TASK="Review the following python code by considering the best practices given in the guidelines below and provide your Observations and Suggestions."
|
| 3 |
+
INSTRUCTIONS="""Identify the code. If no code is present then say 'No code given'.
|
| 4 |
+
Take a deep breath before providing the feedback and thoroughly understand the code logic.
|
| 5 |
Avoid verbosity and repetition in your feedback, focussing on essential points and offering valuable suggestions.
|
| 6 |
Add your own observations and suggestions as needed, and only include comments that are neccessary for clarity and improvement.
|
| 7 |
If you have specific code suggestions, ensure they are correct and aligned with the best practices.
|
|
|
|
| 35 |
Locks are acquired and released in the right order to prevent deadlocks, even in error handling code.
|
| 36 |
All methods are commented in clear language
|
| 37 |
"""
|
| 38 |
+
#First check whether the given input contains any code snippet or not.
|
| 39 |
STEPS="""Follow the steps in the same order:
|
| 40 |
1. Understand the code logic and structure.
|
| 41 |
+
2. Notedown the observations based on the guidelines given above.
|
| 42 |
3. Give suggestions for improving the code.
|
| 43 |
4. Give an example of Final improved code.
|
| 44 |
"""
|
| 45 |
|
| 46 |
+
def default_review_prompt1(code, guidelines=None):
|
| 47 |
if guidelines is None:
|
| 48 |
guidelines=GUIDELINES
|
| 49 |
+
prompt=f"""<Task>: {ROLE} {TASK}
|
| 50 |
<Instructions>: {INSTRUCTIONS}
|
| 51 |
|
| 52 |
<Guidelines>: {guidelines}
|
|
|
|
| 59 |
return prompt
|
| 60 |
|
| 61 |
|
| 62 |
+
def default_review_prompt2(code):
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
+
prompt=f"""<Task>: {ROLE} {TASK}
|
| 65 |
+
<Intsructions>: Analyze the provided code and identify the key components (classes, functions, modules).
|
| 66 |
+
1. Analyze each key component following chain of thoughts. Consider the purpose of the component, its readability, efficiency, and adherence to the listed custom guidelines.
|
| 67 |
+
2. Break down your review into a step-by-step process, explaining your reasoning at each point. Maintain a clear and concise tone throughout the review.
|
| 68 |
+
3. Add your own observations and suggestions as needed, and only include comments that are neccessary for clarity and improvement.
|
| 69 |
+
4. Highlight serious violations.
|
| 70 |
+
5. Give suggestions for improving the code.
|
| 71 |
+
6. Give an example of Final improved code.
|
| 72 |
|
| 73 |
+
<Guidelines>: {GUIDELINES}
|
| 74 |
|
| 75 |
+
<Steps to follow>: {STEPS}
|
| 76 |
|
| 77 |
+
<code>: {code}
|
| 78 |
+
"""
|
| 79 |
|
| 80 |
+
promptt=f"""
|
| 81 |
+
<task>: {ROLE} Review the following code by considering the best practices given in the guidelines below.
|
| 82 |
+
<Guidelines>: {GUIDELINES}
|
|
|
|
| 83 |
|
|
|
|
|
|
|
|
|
|
| 84 |
|
|
|
|
| 85 |
|
| 86 |
+
<Code>: {code}
|
| 87 |
"""
|
| 88 |
|
| 89 |
return prompt
|
| 90 |
|
| 91 |
+
def default_review_prompt3(code):
|
| 92 |
+
prompt= f"""Conduct a comprehensive code review of the provided Python script, focusing on its structure, functionality, and adherence to best practices.\
|
| 93 |
+
The script is designed to automate a specific task, and your review should assess its efficiency, readability, and maintainability.
|
| 94 |
+
|
| 95 |
+
<Guidelines for the Code Review>:
|
| 96 |
+
- Understand the script: Check whether the script contains a python script or not.
|
| 97 |
+
- Structure and Organization: Evaluate the script's overall structure and organization. Is the code logically divided into functions or sections? Are there any redundant or unnecessary sections?
|
| 98 |
+
- Declare constants as applicable: Make sure constants are declared whenever applicable.
|
| 99 |
+
- Functionality and Correctness: Assess the script's functionality and correctness. Does it perform the intended task correctly? Are there any potential errors or edge cases that could cause issues?
|
| 100 |
+
- Readability and Code Quality: Evaluate the script's readability and code quality. Are the variable names descriptive and consistent? Are there any unnecessary comments or redundant code?
|
| 101 |
+
- Efficiency and Performance: Analyze the script's efficiency and performance. Are there any opportunities to optimize the code for better performance or reduce computational complexity?
|
| 102 |
+
- Best Practices and Conventions: Check the script's adherence to best practices and coding conventions. Are there any deviations from standard Python coding conventions or best practices?
|
| 103 |
+
- Error Handling and Debugging: Evaluate the script's error handling and debugging capabilities. Are there any try-except blocks or logging statements to handle potential errors?
|
| 104 |
+
- Code Duplication and Redundancy: Identify any duplicated or redundant code sections. Are there any opportunities to refactor the code to reduce duplication?
|
| 105 |
+
- Security and Vulnerabilities: Assess the script's security and potential vulnerabilities. Are there any sensitive data or user input handling that could lead to security issues?
|
| 106 |
+
- Documentation and Comments: Evaluate the script's documentation and comments. Are there any clear and concise comments explaining the code's purpose and functionality?
|
| 107 |
+
- Testing and Validation: Suggest any additional testing or validation steps to ensure the script's correctness and reliability.
|
| 108 |
+
|
| 109 |
+
<Deliverables>:
|
| 110 |
+
A detailed report summarizing the code review findings, including any suggestions for improvement.
|
| 111 |
+
A revised version of the script incorporating the recommended changes and improvements.
|
| 112 |
+
|
| 113 |
+
<Script>: {code}
|
| 114 |
+
"""
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
return prompt
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def custom_review_prompt(c_prompt,code):
|
| 121 |
return f'{c_prompt}\n<Code>: {code}'
|
| 122 |
+
|
| 123 |
+
def default_refine_prompt(code):
|
| 124 |
+
prompt= f"""You are an expert software engineer and your task is to refine and optimize the code provided below while ensuring accuracy and functionality are maintained.
|
| 125 |
+
Please follow the guidelines on best practices outlined to refine the code's efficiency and readability.
|
| 126 |
+
|
| 127 |
+
<Guidelines on Best Practices>:
|
| 128 |
+
- Use Intention-Revealing Names
|
| 129 |
+
- Declare constants as applicable
|
| 130 |
+
- Don't Repeat Yourself (Avoid Duplication)
|
| 131 |
+
- Explain yourself in code
|
| 132 |
+
- Make sure the code formatting is applied
|
| 133 |
+
- Use Exceptions rather than Return codes
|
| 134 |
+
- Don't return Null
|
| 135 |
+
- Favor the use of standard exceptions
|
| 136 |
+
- Don't ignore exceptions
|
| 137 |
+
- Check parameters for validity
|
| 138 |
+
- Return empty arrays or collections, not nulls
|
| 139 |
+
- Minimize the accessibility of classes and members
|
| 140 |
+
- In public classes, use accessor methods, not public fields
|
| 141 |
+
- Minimize the scope of local variables
|
| 142 |
+
- Refer to objects by their interfaces
|
| 143 |
+
- Adhere to generally accepted naming conventions
|
| 144 |
+
- Avoid finalizers
|
| 145 |
+
- Synchronize access to shared mutable data
|
| 146 |
+
- Valid unit test cases exist
|
| 147 |
+
- Objects accessed by multiple threads are accessed only through a lock, or synchronized methods.
|
| 148 |
+
- Race conditions have been handled
|
| 149 |
+
- Locks are acquired and released in the right order to prevent deadlocks, even in error handling code.
|
| 150 |
+
- All methods are commented in clear language
|
| 151 |
+
- Use List Comprehension: Consider using list comprehension wherever possible.
|
| 152 |
+
- Error Handling: Implement error handling to handle cases where the input is invalid.
|
| 153 |
+
- Function Modularity: If possible, break down the code into smaller, more modular functions for better code organization.
|
| 154 |
+
- Docstrings: Include clear and concise docstrings to describe the purpose of functions and any parameters they accept.
|
| 155 |
+
- Variable Naming: Use descriptive variable names to improve code readability.
|
| 156 |
+
- Efficient Algorithms: Opt for efficient algorithms and data structures to improve performance where possible.
|
| 157 |
+
- Testing: Conduct thorough testing to ensure the optimized code produces the same results as the original.
|
| 158 |
+
|
| 159 |
+
Your expertise in refining and optimizing this code will greatly enhance its efficiency and maintain its functionality.
|
| 160 |
+
|
| 161 |
+
<Deliverables>:
|
| 162 |
+
A refined and optimized version of the code.
|
| 163 |
+
|
| 164 |
+
<Code>: {code}
|
| 165 |
+
"""
|
| 166 |
+
|
| 167 |
+
return prompt
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def default_doc_prompt(code):
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
prompt= f""""For the following python code:\n{code}\n"
|
| 174 |
+
"Generate proper formal documentation."
|
| 175 |
+
"The documentation should describe what the code does and explain the functionality."
|
| 176 |
+
"Include all details which should go in formal documentation"
|
| 177 |
+
"""
|
| 178 |
+
return prompt
|
| 179 |
+
|
| 180 |
+
def validation_prompt(code, guidelines=None):
|
| 181 |
+
prompt=f"""Check if the below input contains code snippets or not. Return only Yes or NO and nothing else.
|
| 182 |
+
Input: {code}
|
| 183 |
+
"""
|
| 184 |
+
return prompt
|