-
-
Notifications
You must be signed in to change notification settings - Fork 25.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
DOC Generated author list from github (#11708)
- Loading branch information
Showing
6 changed files
with
376 additions
and
77 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# Makefile for maintenance tools | ||
|
||
authors: | ||
python generate_authors_table.py > ../doc/authors.rst |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
""" | ||
This script generates an html table of contributors, with names and avatars. | ||
The list is generated from scikit-learn's teams on GitHub, plus a small number | ||
of hard-coded contributors. | ||
The table should be updated for each new inclusion in the teams. | ||
Generating the table requires admin rights. | ||
""" | ||
from __future__ import print_function | ||
|
||
import sys | ||
import requests | ||
import getpass | ||
|
||
try: | ||
# With authentication: up to 5000 requests per hour. | ||
print("user:", file=sys.stderr) | ||
user = input() | ||
passwd = getpass.getpass() | ||
auth = (user, passwd) | ||
except IndexError: | ||
# Without authentication: up to 60 requests per hour. | ||
auth = None | ||
|
||
ROW_SIZE = 7 | ||
LOGO_URL = 'https://avatars2.githubusercontent.com/u/365630?v=4' | ||
|
||
|
||
def group_iterable(iterable, size): | ||
"""Group iterable into lines""" | ||
group = [] | ||
for element in iterable: | ||
group.append(element) | ||
if len(group) == size: | ||
yield group | ||
group = [] | ||
if len(group) != 0: | ||
yield group | ||
|
||
|
||
def get_contributors(): | ||
"""Get the list of contributor profiles. Require admin rights.""" | ||
# get members of scikit-learn teams on GitHub | ||
members = [] | ||
for team in [11523, 33471]: | ||
for page in [1, 2]: # 30 per page | ||
members.extend(requests.get( | ||
"https://api.github.com/teams/%d/members?page=%d" | ||
% (team, page), auth=auth).json()) | ||
|
||
# keep only the logins | ||
logins = [c['login'] for c in members] | ||
# add missing contributors with GitHub accounts | ||
logins.extend(['dubourg', 'jarrodmillman', 'mbrucher', 'thouis']) | ||
# add missing contributors without GitHub accounts | ||
logins.extend(['Angel Soler Gollonet']) | ||
# remove duplicate | ||
logins = set(logins) | ||
# remove CI | ||
logins.remove('sklearn-ci') | ||
|
||
# get profiles from GitHub | ||
profiles = [get_profile(login) for login in logins] | ||
# sort by last name | ||
profiles = sorted(profiles, key=key) | ||
|
||
return profiles | ||
|
||
|
||
def get_profile(login): | ||
"""Get the GitHub profile from login""" | ||
profile = requests.get("https://api.github.com/users/%s" % login, | ||
auth=auth).json() | ||
if 'name' not in profile: | ||
# default profile if the login does not exist | ||
return dict(name=login, avatar_url=LOGO_URL, html_url="") | ||
else: | ||
if profile["name"] is None: | ||
profile["name"] = profile["login"] | ||
|
||
# fix missing names | ||
missing_names = {'bthirion': 'Bertrand Thirion', | ||
'dubourg': 'Vincent Dubourg', | ||
'Duchesnay': 'Edouard Duchesnay', | ||
'Lars': 'Lars Buitinck', | ||
'MechCoder': 'Manoj Kumar'} | ||
if profile["name"] in missing_names: | ||
profile["name"] = missing_names[profile["name"]] | ||
return profile | ||
|
||
|
||
def key(profile): | ||
"""Get the last name in lower case""" | ||
return profile["name"].split(' ')[-1].lower() | ||
|
||
|
||
contributors = get_contributors() | ||
|
||
print(".. raw :: html\n") | ||
print(" <!-- Generated by gen_authors.py -->") | ||
print(" <table>") | ||
print(" <col style='width:%d%%' span='%d'>" | ||
% (int(100 / ROW_SIZE), ROW_SIZE)) | ||
print(" <style>") | ||
print(" img.avatar {border-radius: 10px;}") | ||
print(" td {vertical-align: top;}") | ||
print(" </style>") | ||
for row in group_iterable(contributors, size=ROW_SIZE): | ||
print(" <tr>") | ||
for contributor in row: | ||
print(" <td>") | ||
print(" <a href='%s'><img src='%s' class='avatar' /></a> <br />" | ||
% (contributor["html_url"], contributor["avatar_url"])) | ||
print(" <p>%s</p>" % contributor["name"]) | ||
print(" </td>") | ||
print(" </tr>") | ||
print(" </table>") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.