You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
swarms/examples/tools/dev_swarm_github.py

191 lines
5.5 KiB

import os
from typing import Optional
import requests
from pydantic import BaseModel, Field
class SubmitPullRequestSchema(BaseModel):
# repo_owner: str = Field(
# "kyegomez",
# example="kyegomez",
# description="The owner of the GitHub repository.",
# )
# repo_name: str = Field(
# "swarms",
# example="swarms",
# description="The name of the GitHub repository.",
# )
file_path: str = Field(
...,
example="README.md",
description="The path to the file within the repository.",
)
new_content: str = Field(
...,
description="The new content to be written to the file.",
example="New content for the file.",
)
commit_message: str = Field(
...,
description="The commit message for the change.",
example="Updated README.md content",
)
pr_title: str = Field(
...,
description="The title of the pull request.",
example="Update README.md",
)
pr_body: Optional[str] = Field(
None,
description="The body of the pull request.",
example="This PR improves the README.md content.",
)
class Config:
schema_extra = {
"example": {
# "repo_owner": "kyegomez",
# "repo_name": "swarms",
"file_path": "README.md",
"new_content": "New content for the file.",
"commit_message": "Updated README.md content",
"pr_title": "Update README.md",
"pr_body": "This PR improves the README.md content.",
}
}
class GetFileContentSchema(BaseModel):
repo_owner: str = Field(
...,
example="kyegomez",
description="The owner of the GitHub repository.",
)
repo_name: str = Field(
...,
example="swarms",
description="The name of the GitHub repository.",
)
file_path: str = Field(
...,
example="README.md",
description="The path to the file within the repository.",
)
branch: str = Field(
default="main",
example="main",
description="The branch name to fetch the file from.",
)
class Config:
schema_extra = {
"example": {
"repo_owner": "kyegomez",
"repo_name": "swarms",
"file_path": "README.md",
"branch": "main",
}
}
def get_github_file_content(
file_path: str,
repo_owner: str = "kyegomez",
repo_name: str = "swarms",
branch: str = "main",
) -> str:
"""
Fetches the content of a file from a GitHub repository.
Args:
repo_owner (str): The owner of the repository (e.g., 'kyegomez').
repo_name (str): The name of the repository (e.g., 'swarms').
file_path (str): The path to the file within the repository.
branch (str): The branch name (default is 'main').
Returns:
str: The content of the file as a string.
Raises:
requests.exceptions.RequestException: If there is an error with the request.
ValueError: If the file content cannot be decoded.
"""
url = f"https://raw.githubusercontent.com/{repo_owner}/{repo_name}/{branch}/{file_path}"
try:
response = requests.get(url)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
raise
except ValueError as e:
print(f"Error decoding file content: {e}")
raise
# out = get_github_file_content("README.md")
# print(out)
def submit_pull_request(
file_path: str,
new_content: str,
commit_message: str,
pr_title: str,
pr_body: Optional[str] = None,
repo_owner: str = "kyegomez",
repo_name: str = "swarms",
) -> None:
"""
Submits a pull request to a GitHub repository by modifying a specified file.
Args:
token (str): GitHub personal access token.
repo_owner (str): The owner of the repository (e.g., 'kyegomez').
repo_name (str): The name of the repository (e.g., 'swarms').
file_path (str): The path to the file within the repository.
new_content (str): The new content to write to the file.
commit_message (str): The commit message for the change.
pr_title (str): The title of the pull request.
pr_body (Optional[str]): The body of the pull request (default is None).
Raises:
Exception: If any error occurs during the process.
"""
try:
from github import Github
token = os.getenv("GITHUB_TOKEN")
g = Github(token)
repo = g.get_repo(f"{repo_owner}/{repo_name}")
# Get the file
contents = repo.get_contents(file_path)
current_branch = repo.get_branch("main")
# Create a new branch
new_branch = "modify_" + file_path.replace("/", "_").replace(
".", "_"
)
repo.create_git_ref(
ref=f"refs/heads/{new_branch}",
sha=current_branch.commit.sha,
)
# Update the file
repo.update_file(
contents.path,
commit_message,
new_content,
contents.sha,
branch=new_branch,
)
# Create a pull request
repo.create_pull(
title=pr_title, body=pr_body, head=new_branch, base="main"
)
print("Pull request created successfully.")
except Exception as e:
print(f"Error: {e}")
raise