-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgithub.py
More file actions
executable file
·123 lines (101 loc) · 3.13 KB
/
github.py
File metadata and controls
executable file
·123 lines (101 loc) · 3.13 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
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
114
115
116
117
118
119
120
121
122
123
#!/usr/local/bin/python3.5
# -*- coding:utf-8 -*-
from urllib import request
import json
import sys
import re
from alfred_format import parse
from constant import default_repo_file, default_token_file, default_username
from fs_util import read
base_uri = 'https://api.github.com/users/'
default_user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
required_fields = [
'html_url',
'full_name'
];
class GitHub:
page = 1
token = None
username = None
repos = []
def __init__ (self, username):
self.username = str(username)
if not self.validate_token():
return
if not self.read_repos():
self.fetch()
def validate_token (self):
try:
token = read(default_token_file)
self.token = token.strip()
return token
except IOError:
return False
def get_user_starred_uri (self):
uri = base_uri + self.username + '/' + 'starred?per_page=100&page=' + str(self.page)
self.page += 1
return uri
def add_header (self, request):
request.add_header('user-agent', default_user_agent)
request.add_header('Authorization', 'token ' + self.token.replace('\n', ''))
return request
def read_repos (self):
try:
self.repos = read(default_repo_file, isJson = True) or []
if len(self.repos) == 0:
return False
return True
except:
return False
def filter (self, query):
output = []
default_title = u'更多详细结果, 请前往网页查看'
default_link = 'https://github.com/' + str(self.username) + '?tab=stars';
if not self.token:
output.append({
'full_name': '请先使用s-token 来绑定 token',
'html_url': 'https://github.com/settings/tokens'
})
return output
if not self.username:
output.append({
'full_name': '请先使用 s-user 来添加绑定用户',
'html_url': 'https://github.com'
});
return output;
results = list(filter(lambda item: re.search(query, item['full_name']), self.repos));
if len(results) != 0:
for result in results:
output.append(result)
else:
default_title = u'找不到结果, 请使用网页查询'
output.append({ 'full_name': default_title, 'html_url': default_link })
return output
def filter_fields (self, repos):
def key_filter (item) :
new_obj = {}
for field in required_fields:
new_obj[field] = item[field]
return new_obj
return list(map(key_filter, repos));
def write_repos (self):
with open(default_repo_file, 'w') as f:
f.write(json.dumps(self.filter_fields(self.repos)))
def update (self):
self.repos = [];
self.fetch()
def fetch (self):
req = request.Request(self.get_user_starred_uri())
self.add_header(req)
with request.urlopen(req) as f:
repos = json.loads(f.read().decode('utf-8'))
self.repos += repos
if len(repos) == 100:
self.fetch()
else:
self.write_repos()
github = GitHub(read(default_username))
def main ():
print(parse(github.filter(sys.argv[1])))
if __name__ == '__main__':
main()