-
Notifications
You must be signed in to change notification settings - Fork 2
/
repositories.py
113 lines (93 loc) · 4.27 KB
/
repositories.py
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""
pip install PyGithub
"""
import itertools
import operator
import pathlib
from typing import Optional
import graphinate
from _client import github_user, github_repositories, github_commits, github_files
def repo_graph_model():
graph_model = graphinate.GraphModel(name='github-repository')
@graph_model.edge
def github(user_id: Optional[str] = None,
repository_id: Optional[str] = None,
commit_id: Optional[str] = None,
file_id: Optional[str] = None,
**kwargs):
user = github_user(user_id)
for repo in github_repositories(user_id, repository_id):
yield {'source': (user.login,), 'target': (user.login, repo.name)}
for commit in github_commits(repo, commit_id):
yield {'source': (user.login, repo.name), 'target': (user.login, repo.name, commit.sha)}
for file in github_files(commit, file_id):
yield {'source': (user.login, repo.name, commit.sha),
'target': (user.login, repo.name, commit.sha, file.filename)}
user_node = graph_model.node(key=operator.attrgetter('login'),
value=operator.attrgetter('raw_data'),
label=operator.itemgetter('name'))
repository_node = graph_model.node(parent_type='user',
key=operator.attrgetter('name'),
value=operator.attrgetter('raw_data'),
label=operator.itemgetter('name'))
def commit_label(commit):
return commit['sha'][-7:]
commit_node = graph_model.node(parent_type='repository',
key=operator.attrgetter('sha'),
value=operator.attrgetter('raw_data'),
label=commit_label)
file_node = graph_model.node(parent_type='commit',
uniqueness=True,
key=operator.attrgetter('filename'),
value=operator.attrgetter('raw_data'),
label=operator.itemgetter('filename'))
@user_node
def user(user_id: Optional[str] = None, **kwargs):
yield github_user(user_id)
@repository_node
def repository(user_id: Optional[str] = None,
repository_id: Optional[str] = None,
**kwargs):
repos = github_repositories(user_id, repository_id)
for repo in repos:
yield repo
@commit_node
def commit(user_id: Optional[str] = None,
repository_id: Optional[str] = None,
commit_id: Optional[str] = None,
**kwargs):
for repo in github_repositories(user_id, repository_id):
yield from github_commits(repo, commit_id)
def file_type(user_id: Optional[str] = None,
repository_id: Optional[str] = None,
commit_id: Optional[str] = None,
file_type_id: Optional[str] = None,
**kwargs):
def group_key(file):
return pathlib.PurePath(file).suffix
for repo in github_repositories(user_id, repository_id):
for commit in github_commits(repo, commit_id):
yield from ((k, list(g)) for k, g in
itertools.groupby(sorted(github_files(commit), key=group_key), group_key))
@file_node
def file(user_id: Optional[str] = None,
repository_id: Optional[str] = None,
commit_id: Optional[str] = None,
file_id: Optional[str] = None,
**kwargs):
for repo in github_repositories(user_id, repository_id):
for commit in github_commits(repo, commit_id):
yield from github_files(commit, file_id)
return graph_model
if __name__ == '__main__':
repo_model = repo_graph_model()
params = {
# 'user_id': 'erivlis',
# 'repository_id': 'graphinate',
# 'user_id': 'andybrewer',
# 'repository_id': 'operation-go',
# 'commit_id': None,
# 'file_id': 'README.md',
# 'user_id' "strawberry-graphql"
}
graphinate.materialize("GitHub Repository Graph", repo_model, **params)