Skip to content

Commit 37d27c3

Browse files
committed
Remove the dependency on the PyGithub library #349
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent e7d8f2e commit 37d27c3

1 file changed

Lines changed: 49 additions & 13 deletions

File tree

workflow/integrations/github.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,27 @@
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
88

9-
109
from urllib.parse import urlparse
1110

1211
from django.conf import settings
1312

14-
from github import Github
13+
import requests
1514

15+
GITHUB_API_URL = "https://api.github.com"
1616

17-
def handle_integration(request):
17+
18+
def get_headers():
1819
github_token = settings.DEJACODE_GITHUB_INTEGRATION_TOKEN
1920
if not github_token:
2021
raise Exception("DEJACODE_GITHUB_INTEGRATION_TOKEN is not set.")
2122

22-
github_api = Github(github_token)
23+
return {
24+
"Authorization": f"token {github_token}",
25+
}
26+
27+
28+
def handle_integration(request):
2329
repo_id = extract_github_repo_path(request.request_template.issue_tracker_id)
24-
repo = github_api.get_repo(repo_id)
2530

2631
labels = []
2732
if request.priority:
@@ -30,21 +35,52 @@ def handle_integration(request):
3035
external_issue = request.external_issue
3136

3237
if external_issue: # Update existing issue on GitHib
33-
issue = repo.get_issue(number=int(external_issue.issue_id))
34-
state = "closed" if request.is_closed else "open"
35-
issue.edit(
38+
update_issue(
39+
repo_id=repo_id,
40+
issue_number=external_issue.issue_id,
3641
title=make_issue_title(request),
3742
body=make_issue_body(request),
38-
state=state,
43+
state="closed" if request.is_closed else "open",
3944
)
4045
else:
41-
issue = repo.create_issue(
46+
issue = create_issue(
47+
repo_id=repo_id,
4248
title=make_issue_title(request),
4349
body=make_issue_body(request),
4450
labels=labels,
4551
)
4652
# Create an ExternalIssueLink instance and assign to the Request.
47-
request.link_external_issue(platform="github", repo=repo_id, issue_id=issue.number)
53+
request.link_external_issue(
54+
platform="github",
55+
repo=repo_id,
56+
issue_id=issue["number"],
57+
)
58+
59+
60+
def create_issue(repo_id, title, body=None, labels=None):
61+
url = f"{GITHUB_API_URL}/repos/{repo_id}/issues"
62+
data = {"title": title}
63+
if body:
64+
data["body"] = body
65+
if labels:
66+
data["labels"] = labels
67+
68+
response = requests.post(url, json=data, headers=get_headers(), timeout=10)
69+
return response.json()
70+
71+
72+
def update_issue(repo_id, issue_number, title=None, body=None, state=None):
73+
url = f"{GITHUB_API_URL}/repos/{repo_id}/issues/{issue_number}"
74+
data = {}
75+
if title:
76+
data["title"] = title
77+
if body:
78+
data["body"] = body
79+
if state:
80+
data["state"] = state
81+
82+
response = requests.patch(url, json=data, headers=get_headers(), timeout=10)
83+
return response.json()
4884

4985

5086
def make_issue_title(request):
@@ -65,8 +101,8 @@ def make_issue_body(request):
65101

66102
for question in request.get_serialized_data_as_list():
67103
value = question.get("value")
68-
if question.get("input_type") == 'BooleanField':
69-
value = "Yes" if value in [1, '1'] else "No"
104+
if question.get("input_type") == "BooleanField":
105+
value = "Yes" if value in [1, "1"] else "No"
70106
lines.append(f"### {question.get('label')}\n{value}")
71107

72108
return "\n\n".join(lines)

0 commit comments

Comments
 (0)