環境
- Python 3.10.1
- windows 10
この記事は何?
- 面倒なissue登録をpythonで一括登録できるようにするための記事です
事前準備
- githubのアクセストークンを生成しておく
https://github.com/settings/tokens - 上記のトークンをos.environ.getで環境変数として取得できるようにする
コードを書く
- 各工程の内容はコメントで残しているのでそちらを参照ください
- やっていることは結構単純で、csv(issueのリスト)を読み取り、それをPOSTする
- for文の中で、作成したいissueとsession、apiのurlを引数としてRegisterGitHubIssueServiceを呼び出して渡す
packages\github_issue_register\main.py
import io, sys
from pprint import pprint
import os
import requests
from packages.github_issue_register.classes.Application.IssueConverter import IssueConverter
from packages.github_issue_register.classes.Application.RegisterGitHubIssueService import RegisterGitHubIssueService
from shared.Domain.xcsv import XCsv
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
# issueのリスト(csv)を読み込み
filepath = 'C:\\Users\\nishigaki\\jupyter-lab\\packages\\github_issue_register\\issues.csv'
csv = XCsv()
issue_df = csv.read(filepath, encoding="shift-jis", header=0)
# GithubApiを叩く準備
GITHUB_USERNAME = "masayan1126"
GITHUB_REPO_OWNERNANE = "masayan1126"
GITHUB_REPO_NANE = "stocker"
# 事前にトークンを https://github.com/settings/tokens へ登録し、windowsの環境変数に追加しておくこと
GITHUB_PERSONAL_ACCESS_TOKENS = os.environ.get('GITHUB_PERSONAL_ACCESS_TOKENS')
session = requests.Session()
session.auth = (GITHUB_USERNAME, GITHUB_PERSONAL_ACCESS_TOKENS)
url = 'https://api.github.com/repos/%s/%s/issues' % (GITHUB_REPO_OWNERNANE, GITHUB_REPO_NANE)
# dfをissueオブジェクトに変換し、post
for issue_dict in issue_df.to_dict("index").values():
issue = IssueConverter().to_issue(issue_dict)
res = RegisterGitHubIssueService().execute(url, session,issue)
if res.status_code == 201:
pprint('Successfully created Issue "%s"' % issue.get_title())
else:
pprint('Could not create Issue "%s"' % issue.get_title())
1つ1つのissueオブジェクト
packages\github_issue_register\classes\Domain\issue.py
class Issue:
def __init__(self, title, label):
self.title = title
self.label = label
def get_title(self):
return self.title
def set_title(self, title):
self.title = title
return self
def get_label(self):
return self.label
def set_label(self, label):
self.label = label
return self
# TODO:body
packages\github_issue_register\classes\Application\RegisterGitHubIssueService.py
import json
from packages.github_issue_register.classes.Domain.issue import Issue
class RegisterGitHubIssueService:
def execute(self, url, session, issue: Issue):
res = session.post(url, json.dumps({
"title": issue.get_title(),
"body": "",
# TODO: 複数登録できるように
"labels": [issue.get_label()],
}))
return res
packages\github_issue_register\classes\Application\IssueConverter.py
from packages.github_issue_register.classes.Domain.issue import Issue
class IssueConverter:
def to_issue(self,dict:dict):
return Issue(title=dict["title"], label=dict["label"])
CSVの例
issues.csv
title | label |
例外クラスの自作 | バグ修正 |
バーコードの読み取り制度向上 | 新規追加 |
ローディングアニメーション | バグ修正 |
ナビゲーションバーのコンポーネント化 | 新規追加 |
以上です。
参考
https://docs.github.com/en/rest/reference/issues#create-an-issue
まとめ
いかがでしたでしょうか。本記事では、GithubApiをPythonで叩いて大量のissueを一括で作成する方法について紹介しています。ぜひ参考にしてみてください