1
- #!/usr/bin/env python2
1
+ #!/usr/bin/env python3
2
2
3
3
# This script is under the public domain.
4
4
5
- from bs4 import BeautifulSoup
5
+ import base64
6
6
import json
7
7
import os
8
8
import re
9
9
import time
10
- import urllib2
10
+ from urllib .error import URLError
11
+ from urllib .request import urlopen , Request
11
12
12
13
"""
13
14
Possibly interesting fields:
25
26
def get_repo (repo_id ):
26
27
if repo_id is None :
27
28
return None
28
- api_url = 'https://api.github.com/repos/%s' % repo_id
29
+ headers = {}
30
+ url = 'https://api.github.com/repos/%s' % repo_id
31
+
32
+ # Expected format: username:hexadecimalpersonalaccesstoken.
29
33
try :
30
- api_url2 = '%s?access_token=%s' % ( api_url , os .environ ['GITHUB_TOKEN' ])
34
+ credentials = os .environ ['GITHUB_TOKEN' ]
31
35
except KeyError :
32
- api_url2 = api_url
36
+ pass
37
+ else :
38
+ credentials = base64 .b64encode (bytes (credentials , 'utf-8' ))
39
+ headers ['Authorization' ] = b'Basic ' + credentials
33
40
34
41
try :
35
- response = urllib2 . urlopen (api_url2 )
36
- except urllib2 . HTTPError , e :
37
- print 'Warning: URL %s returned status %d' % ( api_url , e . code )
42
+ response = urlopen (Request ( url , headers = headers ) )
43
+ except URLError as e :
44
+ print ( f 'Warning: Fetching { url } failed: { e . reason } ' )
38
45
try :
39
- print json .load (e )
46
+ print ( json .load (e ) )
40
47
except :
41
48
pass
42
49
return None
@@ -55,31 +62,26 @@ def get_repo_score(repo):
55
62
def repo_url_to_id (url ):
56
63
if url is None :
57
64
return None
58
- m = re .match (r'https? ://github.com/([^/#]+/[^/#]+)/?' , url )
65
+ m = re .match (r'https://github.com/([^/#]+/[^/#]+)/?' , url )
59
66
if m is None :
60
67
return None
61
68
else :
62
69
return m .group (1 )
63
70
64
- def get_all_urls ():
65
- response = urllib2 .urlopen ('http://raft.github.io' )
66
- content = BeautifulSoup (response )
67
- urls = [link .get ('href' ) for link in content .find_all ('a' )]
68
- return list (set (urls ))
69
-
70
71
def get_all_repos ():
71
- urls = get_all_urls ()
72
+ response = urlopen ('https://raft.github.io/implementations.json' )
73
+ impls = json .load (response )
74
+ urls = [impl ['repoURL' ] for impl in impls ]
72
75
repos = [(url , get_repo (repo_url_to_id (url )))
73
76
for url in urls ]
74
77
repos = [(url , repo )
75
78
for url , repo in repos
76
79
if repo is not None ]
77
80
return repos
78
81
79
- def rank (repos , sort_key , result_key , reverse = False ):
80
- for rank , (url , repo ) in enumerate (sorted (repos ,
81
- key = lambda (url , repo ): sort_key (repo ),
82
- reverse = reverse )):
82
+ def rank (repos , sort_key , result_key ):
83
+ for rank , (_url , repo ) in enumerate (sorted (repos ,
84
+ key = lambda repo : sort_key (repo [1 ]))):
83
85
repo [result_key ] = rank
84
86
85
87
def main (filename = 'repos.jsonp' ):
@@ -90,9 +92,9 @@ def main(filename='repos.jsonp'):
90
92
rank (repos ,
91
93
sort_key = lambda repo : repo .get ('updated_at' , '1970-01-01T00:00:00Z' ),
92
94
result_key = 'updated_rank' )
93
- for url , repo in repos :
95
+ for _url , repo in repos :
94
96
repo ['rank' ] = repo ['stars_rank' ] + repo ['updated_rank' ]
95
- repos .sort (key = lambda ( url , repo ) : repo ['rank' ], reverse = True )
97
+ repos .sort (key = lambda repo : repo [ 1 ] ['rank' ], reverse = True )
96
98
f = open (filename , 'w' )
97
99
f .write ('var raft_repos = function() {\n ' )
98
100
f .write ('return ' )
@@ -101,7 +103,8 @@ def main(filename='repos.jsonp'):
101
103
'stars' : repo ['stargazers_count' ],
102
104
'updated' : repo ['updated_at' ]})
103
105
for (url , repo ) in repos ]),
104
- f )
106
+ f ,
107
+ indent = 4 )
105
108
f .write (';\n ' )
106
109
f .write ('};\n ' )
107
110
0 commit comments