"""Fetches my public repositories and downloads tagged versions.""" from datetime import datetime import sys import json import requests USERNAME = "mitjafelicijan" CACHE_BUSTER = int(datetime.now().timestamp()) DOUBLE_NL = "\n\n" headers = { "Accept": "application/vnd.github.v3+json" } def generate_markdown_file(include_repositories): file = open("../content/pages/projects.github.md.part", "w") file.write(DOUBLE_NL) file.write("# GitHub repositories") file.write(DOUBLE_NL) file.write("
") file.write(DOUBLE_NL) for repo in include_repositories: file.write(f"- [{repo['name']}](#{repo['name'].lower()}) \n") file.write(DOUBLE_NL) file.write("
") file.write(DOUBLE_NL) for repo in include_repositories: print(f"> {repo['name']}") file.write(f"## {repo['name']}\n") file.write(f"{repo['description']}\n") file.write(DOUBLE_NL) file.write("
") file.write(DOUBLE_NL) file.write("|Released|Description|Download|\n") file.write("|--------|-----------|--------|\n") for release in repo['releases']: print(f" - {release['name']} - {release['created_at']}") dt = datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%SZ") file.write(f"|{dt.strftime('%Y-%m-%d')}|{release['name']}| [{release['filename']}](/projects/{release['filename']}) |\n") file.write(DOUBLE_NL) file.write("
") file.write(DOUBLE_NL) file.write("") file.write(DOUBLE_NL) file.write(DOUBLE_NL) file.write("") file.write(DOUBLE_NL) file.close() def download_tarball(url, filepath): with requests.get(url, stream=True, timeout=30) as response: response.raise_for_status() with open(filepath, "wb") as file: for chunk in response.iter_content(chunk_size=8192): file.write(chunk) def assert_rate_limit(response): rate_limit_limit = int(response.headers.get("x-ratelimit-limit")) rate_limit_remaining = int(response.headers.get("x-ratelimit-remaining")) rate_limit_reset = int(response.headers.get("x-ratelimit-reset")) print(f"Rate limit: {rate_limit_remaining}/{rate_limit_limit}") print(f"Reset time: {datetime.fromtimestamp(rate_limit_reset)}") if rate_limit_remaining == 0: sys.exit(1) def fetch_github_data(): include_repositories = [] print(headers) response = requests.get(f"https://api.github.com/users/{USERNAME}/repos?ts={CACHE_BUSTER}&per_page=100", headers=headers, timeout=10) assert_rate_limit(response) if response.status_code == 200: repos = response.json() for repo in repos: # Check if repository has "winc" topic. This means I want to include # this repository on this page. if "winc" in repo["topics"]: include_repositories.append(repo) else: print(f"Failed to retrieve repositories: {response.status_code}") sys.exit(1) for repo in include_repositories: print(f"Name: {repo['name']}, URL: {repo['html_url']}") response = requests.get(f"https://api.github.com/repos/{USERNAME}/{repo['name']}/releases?ts={CACHE_BUSTER}", headers=headers, timeout=10) assert_rate_limit(response) if response.status_code == 200: repo["releases"] = response.json() for release in repo["releases"]: release["filename"] = f"{repo['name']}-{release['tag_name']}.tar.gz" print(f" > {release['tag_name']}, {release['name']}, {release['filename']}") download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}") return include_repositories include_repositories = fetch_github_data() # with open("out.json", "w") as json_file: # json.dump(include_repositories, json_file, indent=4) generate_markdown_file(include_repositories) # with open("out.json", "r") as fp: # include_repositories = json.load(fp) # generate_markdown_file(include_repositories)