get_subscribe/get_projaec_info.py

117 lines
3.2 KiB
Python

import argparse
import os
import re
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import pandas as pd
import requests
from datetime import date
def get_project_info(user, project, name, item, date_key, token=""):
header = {
"Accept": "application/vnd.github.v3.star+json"
}
if token:
header.update({
"Authorization": f"token {token}",
})
data_list = []
page = 0
date_pat = re.compile(r"\d{4}-\d{2}-\d{2}")
while True:
page += 1
url = f"https://api.github.com/repos/{user}/{project}/{item}?page={page}&per_page=100"
req = requests.get(url, headers=header, timeout=30)
req.raise_for_status()
datas = req.json()
if not datas:
break
data_list.extend([date_pat.match(i.get(date_key)).group() for i in datas])
date_dic = {}
start_date = min(data_list) if data_list else date.today().isoformat()
end_date = date.today()
for date_str in data_list:
if not date_dic.get(date_str):
date_dic[date_str] = 0
date_dic[date_str] += 1
date_list = pd.date_range(start_date, end_date)
star_num = 0
star_num_list = []
for date_str in date_list:
star_num += date_dic.get(str(date_str).split()[0], 0)
star_num_list.append(star_num)
data = {
"name": name,
"num_list": star_num_list,
"date_list": date_list,
}
return data
def create_svg(project, datas, save_path, theme=""):
fig, ax = plt.subplots(figsize=(12, 5))
# 设置透明
fig.patch.set_alpha(.0)
ax.patch.set_alpha(.0)
# 坐标
ax.tick_params(color='darkgrey', labelcolor='darkgrey')
# 坐标轴
plt.gca().yaxis.set_major_locator(MaxNLocator(integer=True))
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color("darkgrey")
ax.spines['left'].set_color("darkgrey")
ax.spines['right'].set_color('none')
# 绘线
for data in datas:
date_list = data["date_list"]
num_list = data["num_list"]
name = data["name"]
ax.plot(date_list, num_list, label=name)
# 图例
ax.legend(
frameon=False,
loc=2,
bbox_to_anchor=(1.05, 0.0, 3.0, 0.0),
borderaxespad = 0.,
labelcolor='darkgrey'
)
# 标题
ax.set_title(f"{project} history", color='darkgrey')
# 网格
ax.grid(True, linestyle='-.')
plt.savefig(save_path)
plt.close(fig)
def main(user, project, save_path, theme="", token=""):
datas = [
get_project_info(user, project, "star", "stargazers", "starred_at",token),
get_project_info(user, project, "fork", "forks", "created_at",token)
]
create_svg(project, datas, save_path, theme)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument("--user", type=str)
parser.add_argument("--project", type=str)
parser.add_argument("--save_path", type=str)
parser.add_argument("--theme", type=str, default="")
parser.add_argument("--token", type=str, default=os.environ.get("GH_TOKEN", ""))
args = parser.parse_args()
main(args.user, args.project, args.save_path, args.theme, args.token)