Build & Deploy / deploy (push) Successful in 54s
Claude-Session: https://claude.ai/code/session_01GGe7kUhooMFuzY6GaDb2w9
76 lines
2.8 KiB
Python
Executable File
76 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Henter det sitet viser fra Gitea ved build og skriver data/gitea.json:
|
|
repos til /projekter og aktivitets-heatmap til /now. Er Gitea nede, bygges sitet
|
|
alligevel, med en fejlbesked på /projekter og en tom graf på /now."""
|
|
import datetime as dt
|
|
import json
|
|
import urllib.request
|
|
|
|
BASE, USER = "https://gitea.weircon.dk", "agw"
|
|
HIDE = set() # repo-navne der skjules helt
|
|
PINNED = ["gtk-ahfail", "pi3-smart-workspace"] # vises først, i den rækkefølge
|
|
WEEKS = 26
|
|
MAANEDER = ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august",
|
|
"september", "oktober", "november", "december"]
|
|
|
|
|
|
def get(path):
|
|
req = urllib.request.Request(f"{BASE}/api/v1{path}", headers={"Accept": "application/json"})
|
|
with urllib.request.urlopen(req, timeout=30) as r:
|
|
return json.load(r)
|
|
|
|
|
|
def repos():
|
|
data = get(f"/users/{USER}/repos?limit=50&sort=updated")
|
|
rs = [r for r in data if not (r["fork"] or r["archived"] or r["private"] or r["name"].lower() in HIDE)]
|
|
pinned = [p.lower() for p in PINNED]
|
|
rs.sort(key=lambda r: r["updated_at"], reverse=True)
|
|
rs.sort(key=lambda r: pinned.index(r["name"].lower()) if r["name"].lower() in pinned else len(pinned))
|
|
keep = ("name", "description", "html_url", "language", "stars_count")
|
|
return [{k: r[k] for k in keep} for r in rs]
|
|
|
|
|
|
def level(n):
|
|
return 0 if n == 0 else 1 if n < 3 else 2 if n < 6 else 3 if n < 12 else 4
|
|
|
|
|
|
def heatmap():
|
|
per_day = {}
|
|
try:
|
|
for b in get(f"/users/{USER}/heatmap"):
|
|
d = dt.datetime.fromtimestamp(b["timestamp"], dt.timezone.utc).date().isoformat()
|
|
per_day[d] = per_day.get(d, 0) + b["contributions"]
|
|
except Exception as e:
|
|
print(f"heatmap: {e}")
|
|
# 26 uger bagud, uger som kolonner (man-søn)
|
|
today = dt.date.today()
|
|
cur = today - dt.timedelta(days=WEEKS * 7 - 1 + today.weekday())
|
|
weeks = []
|
|
while cur <= today:
|
|
week = []
|
|
for _ in range(7):
|
|
if cur > today:
|
|
break
|
|
n = per_day.get(cur.isoformat(), 0)
|
|
week.append({"date": cur.isoformat(), "n": n, "level": level(n)})
|
|
cur += dt.timedelta(days=1)
|
|
weeks.append(week)
|
|
return weeks, sum(per_day.values()), f"{today.day}. {MAANEDER[today.month - 1]} {today.year}"
|
|
|
|
|
|
def main():
|
|
try:
|
|
rs, error = repos(), False
|
|
except Exception as e:
|
|
print(f"repos: {e}")
|
|
rs, error = [], True
|
|
weeks, total, updated = heatmap()
|
|
with open("data/gitea.json", "w") as f:
|
|
json.dump({"repos": rs, "error": error, "weeks": weeks, "weeks_shown": WEEKS,
|
|
"total": total, "updated": updated}, f, ensure_ascii=False)
|
|
print(f"gitea: {len(rs)} repos, {total} bidrag")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|