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.
67 lines
1.6 KiB
67 lines
1.6 KiB
import os
|
|
import subprocess
|
|
|
|
import requests
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv
|
|
|
|
# Constants
|
|
GITHUB_USERNAME = os.getenv("GITHUB_USERNAME")
|
|
REPO_NAME = os.getenv("GITHUB_REPO_NAME")
|
|
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
|
ISSUES_URL = f"https://api.github.com/repos/{GITHUB_USERNAME}/{REPO_NAME}/issues"
|
|
|
|
# Headers for authentication
|
|
headers = {
|
|
"Authorization": f"token {GITHUB_TOKEN}",
|
|
"Accept": "application/vnd.github.v3+json",
|
|
}
|
|
|
|
|
|
def run_pytest():
|
|
result = subprocess.run(
|
|
["pytest"], capture_output=True, text=True
|
|
)
|
|
return result.stdout + result.stderr
|
|
|
|
|
|
def parse_pytest_output(output):
|
|
errors = []
|
|
current_error = None
|
|
|
|
for line in output.split("\n"):
|
|
if line.startswith("_________________________"):
|
|
if current_error:
|
|
errors.append(current_error)
|
|
current_error = {"title": "", "body": ""}
|
|
elif current_error is not None:
|
|
if not current_error["title"]:
|
|
current_error["title"] = line.strip()
|
|
current_error["body"] += line + "\n"
|
|
|
|
if current_error:
|
|
errors.append(current_error)
|
|
return errors
|
|
|
|
|
|
def create_github_issue(title, body):
|
|
issue = {"title": title, "body": body}
|
|
response = requests.post(ISSUES_URL, headers=headers, json=issue)
|
|
return response.json()
|
|
|
|
|
|
def main():
|
|
pytest_output = run_pytest()
|
|
errors = parse_pytest_output(pytest_output)
|
|
|
|
for error in errors:
|
|
issue_response = create_github_issue(
|
|
error["title"], error["body"]
|
|
)
|
|
print(f"Issue created: {issue_response.get('html_url')}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|