160 lines
5.3 KiB
Python
160 lines
5.3 KiB
Python
#
|
|
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
#
|
|
|
|
# type: ignore
|
|
import json
|
|
import logging
|
|
from typing import Iterator, Optional
|
|
|
|
import requests
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
|
def logger(func):
|
|
def wrapper(*args):
|
|
logging.info(f"Function: {func.__name__}")
|
|
responses = func(*args)
|
|
for response in responses:
|
|
# github return 3 success status code 200, 201 and 204, we should check all of them
|
|
logging.info(
|
|
f"Response status: {response.status_code}, response body: {'Success' if response.status_code in [200, 201, 204] else response.content}"
|
|
)
|
|
|
|
return wrapper
|
|
|
|
|
|
class GitHubFiller:
|
|
BASE_URL = "https://api.github.com"
|
|
|
|
def __init__(self, token: str, repository: str):
|
|
self.token = token
|
|
self.repository = repository
|
|
self.session = requests.Session()
|
|
self.session.headers.update(self.get_headers(self.token))
|
|
|
|
self.branches: Optional[list] = None
|
|
|
|
@staticmethod
|
|
def get_headers(token: str):
|
|
return {
|
|
"Authorization": f"Bearer {token}",
|
|
"Accept": "application/vnd.github.v3+json application/vnd.github.inertia-preview+json",
|
|
}
|
|
|
|
def run(self) -> None:
|
|
self.get_all_branches()
|
|
self.pull_requests()
|
|
self.create_milestone()
|
|
labels = ["important", "bug", "critical"]
|
|
milestone = 1
|
|
assignees = []
|
|
self.create_release()
|
|
self.star_a_repository()
|
|
self.create_projects()
|
|
self.add_issues_with_comments(labels, milestone, assignees)
|
|
|
|
@logger
|
|
def get_all_branches(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/branches"
|
|
response = self.session.get(url=url)
|
|
self.branches = response.json()
|
|
yield response
|
|
|
|
@logger
|
|
def pull_requests(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/pulls"
|
|
|
|
for branch in self.branches:
|
|
create_pr_data = {
|
|
"title": f"New PR from {branch.get('name')}",
|
|
"head": branch.get("name"),
|
|
"base": "master",
|
|
}
|
|
# create PR
|
|
response = self.session.post(url=url, data=json.dumps(create_pr_data))
|
|
yield response
|
|
|
|
if response.status_code == 200 or 201:
|
|
# create review for PR
|
|
create_review_data = {
|
|
"body": f"Review commit for branch {branch.get('name')}",
|
|
"event": "COMMENT",
|
|
}
|
|
review_url = f"{self.BASE_URL}/repos/{self.repository}/pulls/{response.json().get('number')}/reviews"
|
|
response = self.session.post(url=review_url, data=json.dumps(create_review_data))
|
|
yield response
|
|
|
|
# create comment for commit
|
|
create_comment_data = {
|
|
"body": f"comment for {branch.get('commit').get('sha')} branch",
|
|
}
|
|
commit_url = f"https://api.github.com/repos/{self.repository}/commits/{branch.get('commit').get('sha')}/comments"
|
|
response = self.session.post(url=commit_url, data=json.dumps(create_comment_data))
|
|
yield response
|
|
|
|
@logger
|
|
def add_issues_with_comments(
|
|
self,
|
|
labels: Optional[list],
|
|
milestone: Optional[list],
|
|
assignees: Optional[list],
|
|
) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/issues"
|
|
|
|
for branch in self.branches:
|
|
data = {
|
|
"title": f"Issue for branch {branch.get('name')}",
|
|
"head": branch.get("name"),
|
|
"labels": labels,
|
|
"milestone": milestone,
|
|
"assignees": assignees,
|
|
}
|
|
|
|
# add issue
|
|
response = self.session.post(url=url, data=json.dumps(data))
|
|
yield response
|
|
|
|
# add issue comment
|
|
comments_url = response.json().get("comments_url")
|
|
response = self.add_issue_comment(comments_url)
|
|
yield response
|
|
|
|
def add_issue_comment(self, comments_url: str) -> requests.Response:
|
|
return self.session.post(
|
|
url=comments_url,
|
|
data=json.dumps({"body": f"comment for issues {comments_url}"}),
|
|
)
|
|
|
|
@logger
|
|
def create_release(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/releases"
|
|
|
|
for i in range(10):
|
|
data = {"tag_name": f"dev-0.{i}", "name": "{i} global release"}
|
|
response = self.session.post(url=url, data=json.dumps(data))
|
|
yield response
|
|
|
|
@logger
|
|
def star_a_repository(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/user/starred/{self.repository}"
|
|
response = self.session.put(url=url)
|
|
yield response
|
|
|
|
@logger
|
|
def create_projects(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/projects"
|
|
for name in ["project_1", "project_2", "project_3"]:
|
|
response = self.session.post(url=url, data=json.dumps({"name": name}))
|
|
yield response
|
|
|
|
@logger
|
|
def create_milestone(self) -> Iterator:
|
|
url = f"{self.BASE_URL}/repos/{self.repository}/milestones"
|
|
for title in ["main", "test", "feature"]:
|
|
data = {"title": title}
|
|
response = self.session.post(url=url, data=json.dumps(data))
|
|
yield response
|