| | from src.dev_pilot.state.sdlc_state import SDLCState, UserStoryList |
| | from src.dev_pilot.utils.Utility import Utility |
| | from loguru import logger |
| |
|
| | class CodingNode: |
| | """ |
| | Graph Node for the Coding |
| | |
| | """ |
| | |
| | def __init__(self, model): |
| | self.llm = model |
| | self.utility = Utility() |
| | |
| | |
| | def generate_code(self, state: SDLCState): |
| | """ |
| | Generates the code for the given SDLC state as multiple Python files. |
| | """ |
| | logger.info("----- Generating the code ----") |
| | |
| | requirements = state.get('requirements', '') |
| | user_stories = state.get('user_stories', '') |
| | code_feedback = state.get('code_review_feedback', '') if 'code_generated' in state else "" |
| | security_feedback = state.get('security_recommendations', '') if 'security_recommendations' in state else "" |
| | |
| | prompt = f""" |
| | Generate a complete Python project organized as multiple code files. |
| | Based on the following SDLC state, generate only the Python code files with their complete implementations. |
| | Do NOT include any explanations, requirements text, or design document details in the output—only code files with proper names and code content. |
| | |
| | SDLC State: |
| | --------------- |
| | Project Name: {state['project_name']} |
| | |
| | Requirements: |
| | {self.utility.format_list(requirements)} |
| | |
| | User Stories: |
| | {self.utility.format_user_stories(user_stories)} |
| | |
| | Functional Design Document: |
| | {state['design_documents']['functional']} |
| | |
| | Technical Design Document: |
| | {state['design_documents']['technical']} |
| | |
| | {"Note: Incorporate the following code review feedback: " + code_feedback if code_feedback else ""} |
| | {"Note: Apply the following security recommendations: " + security_feedback if security_feedback else ""} |
| | |
| | Instructions: |
| | - Structure the output as multiple code files (for example, "main.py", "module1.py", etc.), each separated clearly. |
| | - Each file should contain only the code necessary for a modular, fully-functional project based on the input state. |
| | - Do not output any additional text, explanations, or commentary outside the code files. |
| | - Ensure the code follows Python best practices, is syntactically correct, and is ready for development. |
| | """ |
| | response = self.llm.invoke(prompt) |
| | code_review_comments = self.get_code_review_comments(code=response.content) |
| | return { |
| | 'code_generated': response.content, |
| | 'code_review_comments': code_review_comments |
| | } |
| | |
| | |
| | def get_code_review_comments(self, code: str): |
| | """ |
| | Generate code review comments for the provided code |
| | """ |
| | logger.info("----- Generating code review comments ----") |
| | |
| | |
| | prompt = f""" |
| | You are a coding expert. Please review the following code and provide detailed feedback: |
| | ``` |
| | {code} |
| | ``` |
| | Focus on: |
| | 1. Code quality and best practices |
| | 2. Potential bugs or edge cases |
| | 3. Performance considerations |
| | 4. Security concerns |
| | |
| | End your review with an explicit APPROVED or NEEDS_FEEDBACK status. |
| | """ |
| | |
| | |
| | response = self.llm.invoke(prompt) |
| | review_comments = response.content |
| | return review_comments |
| | |
| | def code_review(self, state: SDLCState): |
| | return state |
| | |
| | def fix_code(self, state: SDLCState): |
| | pass |
| | |
| | def code_review_router(self, state: SDLCState): |
| | """ |
| | Evaluates Code review is required or not. |
| | """ |
| | return state.get("code_review_status", "approved") |
| | |
| | |
| | def security_review_recommendations(self, state: SDLCState): |
| | """ |
| | Performs security review of the code generated |
| | """ |
| | logger.info("----- Generating security recommendations ----") |
| | |
| | |
| | code_generated = state.get('code_generated', '') |
| |
|
| | |
| | prompt = f""" |
| | You are a security expert. Please review the following Python code for potential security vulnerabilities: |
| | ``` |
| | {code_generated} |
| | ``` |
| | Focus on: |
| | 1. Identifying potential security risks (e.g., SQL injection, XSS, insecure data handling). |
| | 2. Providing recommendations to mitigate these risks. |
| | 3. Highlighting any best practices that are missing. |
| | |
| | End your review with an explicit APPROVED or NEEDS_FEEDBACK status. |
| | """ |
| |
|
| | |
| | response = self.llm.invoke(prompt) |
| | state["security_recommendations"] = response.content |
| | return state |
| | |
| | def security_review(self, state: SDLCState): |
| | return state |
| | |
| | def fix_code_after_security_review(self, state: SDLCState): |
| | pass |
| | |
| | def security_review_router(self, state: SDLCState): |
| | """ |
| | Security Code review is required or not. |
| | """ |
| | return state.get("security_review_status", "approved") |
| | |
| | |
| | def write_test_cases(self, state: SDLCState): |
| | """ |
| | Generates the test cases based on the generated code and code review comments |
| | """ |
| | logger.info("----- Generating Test Cases ----") |
| | |
| | |
| | code_generated = state.get('code_generated', '') |
| | code_review_comments = state.get('code_review_comments', '') |
| |
|
| | |
| | prompt = f""" |
| | You are a software testing expert. Based on the following Python code and its review comments, generate comprehensive test cases: |
| | |
| | ### Code: |
| | ``` |
| | {code_generated} |
| | ``` |
| | |
| | ### Code Review Comments: |
| | {code_review_comments} |
| | |
| | Focus on: |
| | 1. Covering all edge cases and boundary conditions. |
| | 2. Ensuring functional correctness of the code. |
| | 3. Including both positive and negative test cases. |
| | 4. Writing test cases in Python's `unittest` framework format. |
| | |
| | Provide the test cases in Python code format, ready to be executed. |
| | """ |
| |
|
| | response = self.llm.invoke(prompt) |
| | state["test_cases"] = response.content |
| |
|
| | return state |
| | |
| | def review_test_cases(self, state: SDLCState): |
| | return state |
| | |
| | def revise_test_cases(self, state: SDLCState): |
| | pass |
| | |
| | def review_test_cases_router(self, state: SDLCState): |
| | """ |
| | Evaluates Test Cases review is required or not. |
| | """ |
| | return state.get("test_case_review_status", "approved") |
| | |
| | |
| | def qa_testing(self, state: SDLCState): |
| | """ |
| | Performs QA testing based on the generated code and test cases |
| | """ |
| | logger.info("----- Performing QA Testing ----") |
| | |
| | code_generated = state.get('code_generated', '') |
| | test_cases = state.get('test_cases', '') |
| |
|
| | |
| | prompt = f""" |
| | You are a QA testing expert. Based on the following Python code and test cases, simulate running the test cases and provide feedback: |
| | |
| | ### Code: |
| | ``` |
| | {code_generated} |
| | ``` |
| | |
| | ### Test Cases: |
| | ``` |
| | {test_cases} |
| | ``` |
| | |
| | Focus on: |
| | 1. Identifying which test cases pass and which fail. |
| | 2. Providing detailed feedback for any failed test cases, including the reason for failure. |
| | 3. Suggesting improvements to the code or test cases if necessary. |
| | |
| | Provide the results in the following format: |
| | - Test Case ID: [ID] |
| | Status: [Pass/Fail] |
| | Feedback: [Detailed feedback if failed] |
| | """ |
| |
|
| | |
| | response = self.llm.invoke(prompt) |
| | qa_testing_comments = response.content |
| |
|
| | state["qa_testing_comments"]= qa_testing_comments |
| | return state |
| | |
| | def qa_review(self, state: SDLCState): |
| | pass |
| | |
| | def deployment(self, state: SDLCState): |
| | """ |
| | Performs the deployment |
| | """ |
| | logger.info("----- Generating Deployment Simulation----") |
| |
|
| | code_generated = state.get('code_generated', '') |
| |
|
| | |
| | prompt = f""" |
| | You are a DevOps expert. Based on the following Python code, simulate the deployment process and provide feedback: |
| | |
| | ### Code: |
| | ``` |
| | {code_generated} |
| | ``` |
| | |
| | Focus on: |
| | 1. Identifying potential deployment issues (e.g., missing dependencies, configuration errors). |
| | 2. Providing recommendations to resolve any issues. |
| | 3. Confirming whether the deployment is successful or needs further action. |
| | |
| | Provide the results in the following format: |
| | - Deployment Status: [Success/Failed] |
| | - Feedback: [Detailed feedback on the deployment process] |
| | """ |
| |
|
| | |
| | response = self.llm.invoke(prompt) |
| | deployment_feedback = response.content |
| |
|
| | |
| | if "SUCCESS" in deployment_feedback.upper(): |
| | deployment_status = "success" |
| | else: |
| | deployment_status = "failed" |
| |
|
| | |
| | return { |
| | **state, |
| | "deployment_status": deployment_status, |
| | "deployment_feedback": deployment_feedback |
| | } |