From 7faebc507cb9a561f12d9884d79c3d6939a812d6 Mon Sep 17 00:00:00 2001 From: Vinnicyus Gracindo Date: Sat, 17 May 2025 12:13:04 -0300 Subject: [PATCH] Day 1 activity: pull request reviewer --- .../day-1-pull-request-review.ipynb | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 week1/community-contributions/day-1-pull-request-review.ipynb diff --git a/week1/community-contributions/day-1-pull-request-review.ipynb b/week1/community-contributions/day-1-pull-request-review.ipynb new file mode 100644 index 0000000..88c0136 --- /dev/null +++ b/week1/community-contributions/day-1-pull-request-review.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "6af348cb", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import os\n", + "import requests\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8254a11a", + "metadata": {}, + "outputs": [], + "source": [ + "# Load environment variables in a file called .env and load openai\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n", + "# Use a personal access token (PAT) for authentication. This allows access to private repositories and avoids low request limits.\n", + "# You can generate a token at: https://github.com/settings/tokens\n", + "github_token = os.getenv('GITHUB_TOKEN')\n", + "openai = OpenAI()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac552db9", + "metadata": {}, + "outputs": [], + "source": [ + "def extract_diff_from_pr(pr_url: str) -> str:\n", + " parts = pr_url.rstrip(\"/\").split(\"/\")\n", + " owner, repo, pr_number = parts[3], parts[4], parts[6]\n", + " \n", + " api_url = f\"https://github.com/{owner}/{repo}/pull/{pr_number}.diff\"\n", + " headers = {\n", + " \"Accept\": \"application/vnd.github.v3.diff\",\n", + " \"Authorization\": f\"token {github_token}\"\n", + " }\n", + "\n", + " response = requests.get(api_url, headers=headers)\n", + " response.raise_for_status()\n", + " \n", + " return response.text\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45d4012b", + "metadata": {}, + "outputs": [], + "source": [ + "system_prompt = \"\"\"You are an assistant that reviews code and provides concise, constructive feedback based on best practices. \n", + "Focus on readability, architecture, performance, security, testability, and adherence to style guides.\n", + "Highlight issues and suggest improvements clearly. Respond in English and in markdown.\"\"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ed584ec", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(code_diffs):\n", + " user_prompt = \"You are reviewing the following code diffs\"\n", + " user_prompt += \". Please provide a concise code review focused on best practices: readability, architecture, performance, security, testability, and style guide adherence.\\n\"\n", + " user_prompt += \"Use a numbered list and be constructive. Suggest improvements where necessary, and highlight what was done well.\\n\\n\"\n", + " user_prompt += code_diffs\n", + " return user_prompt\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc403124", + "metadata": {}, + "outputs": [], + "source": [ + "def code_review_for(code_diffs):\n", + " return [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(code_diffs)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5208abd3", + "metadata": {}, + "outputs": [], + "source": [ + "def reviewer(pr_link):\n", + " response = openai.chat.completions.create(\n", + " model = \"gpt-4o-mini\",\n", + " messages = code_review_for(extract_diff_from_pr(pr_link))\n", + " )\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "525d92bf", + "metadata": {}, + "outputs": [], + "source": [ + "def display_code_review(pr_link):\n", + " code_review = reviewer(pr_link)\n", + " display(Markdown(code_review))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03517335", + "metadata": {}, + "outputs": [], + "source": [ + "display_code_review(\"GITHUB PR LINK HERE\")" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}