-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgithub_api.py
More file actions
71 lines (58 loc) · 3.29 KB
/
github_api.py
File metadata and controls
71 lines (58 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""Lightweight Python client for GitHub public API."""
import requests
BASE = "https://api.github.com"
class GitHubClient:
def __init__(self, token=None, timeout=15):
self.timeout = timeout
self.headers = {"Accept": "application/vnd.github+json"}
if token:
self.headers["Authorization"] = f"Bearer {token}"
def _get(self, path, params=None):
r = requests.get(f"{BASE}{path}", headers=self.headers, params=params, timeout=self.timeout)
r.raise_for_status()
return r.json()
def user(self, username):
data = self._get(f"/users/{username}")
return {
"login": data["login"],
"name": data.get("name"),
"bio": data.get("bio"),
"public_repos": data["public_repos"],
"followers": data["followers"],
"following": data["following"],
"company": data.get("company"),
"location": data.get("location"),
"blog": data.get("blog"),
"created_at": data["created_at"],
}
def repos(self, username, sort="updated", direction="desc", per_page=30):
data = self._get(f"/users/{username}/repos", {"sort": sort, "direction": direction, "per_page": per_page})
return [{"name": r["name"], "full_name": r["full_name"], "description": r.get("description"),
"stars": r["stargazers_count"], "forks": r["forks_count"], "language": r.get("language"),
"updated_at": r["updated_at"]} for r in data]
def repo(self, owner, name):
data = self._get(f"/repos/{owner}/{name}")
return {"full_name": data["full_name"], "description": data.get("description"),
"stars": data["stargazers_count"], "forks": data["forks_count"],
"language": data.get("language"), "topics": data.get("topics", []),
"open_issues": data["open_issues_count"], "license": (data.get("license") or {}).get("spdx_id")}
def search_repos(self, query, sort="stars", order="desc", per_page=10):
data = self._get("/search/repositories", {"q": query, "sort": sort, "order": order, "per_page": per_page})
return [{"full_name": r["full_name"], "description": r.get("description"),
"stars": r["stargazers_count"], "language": r.get("language")} for r in data["items"]]
def search_users(self, query, sort="followers", per_page=10):
data = self._get("/search/users", {"q": query, "sort": sort, "per_page": per_page})
return [{"login": u["login"], "type": u["type"]} for u in data["items"]]
def search_topics(self, query, per_page=10):
headers = {**self.headers, "Accept": "application/vnd.github.mercy-preview+json"}
r = requests.get(f"{BASE}/search/topics", headers=headers, params={"q": query, "per_page": per_page}, timeout=self.timeout)
r.raise_for_status()
return [{"name": t["name"], "description": t.get("description", ""),
"featured": t.get("featured", False)} for t in r.json()["items"]]
if __name__ == "__main__":
client = GitHubClient()
user = client.user("torvalds")
print(f"{user['name']} — {user['public_repos']} repos, {user['followers']} followers")
repos = client.repos("torvalds")
for r in repos[:3]:
print(f" {r['name']} — {r['stars']} stars")