mirror of https://github.com/zulip/zulip.git
team: Map repo name to tab name in frontend.
fetch-contributor-data's job is to fetch the data. How the data is presented in frontend is something it don't have to know about.
This commit is contained in:
parent
fe9b700fab
commit
2190dbd4b0
|
@ -1,26 +1,25 @@
|
|||
const contributors_list = page_params.contrib;
|
||||
|
||||
// `repos` are repositories to be shown as tabs, whereas `hidden_repos` are
|
||||
// repositories that should count towards the total but not have tabs.
|
||||
const repos = [
|
||||
"server",
|
||||
"desktop",
|
||||
"mobile",
|
||||
"python-zulip-api",
|
||||
"zulip-js",
|
||||
"zulipbot",
|
||||
"terminal",
|
||||
];
|
||||
const hidden_repos = ["zulip-android", "zulip-ios-legacy"];
|
||||
const repo_name_to_tab_name = {
|
||||
zulip: "server",
|
||||
"zulip-desktop": "desktop",
|
||||
"zulip-mobile": "mobile",
|
||||
"python-zulip-api": "python-zulip-api",
|
||||
"zulip-js": "zulip-js",
|
||||
zulipbot: "zulipbot",
|
||||
"zulip-terminal": "terminal",
|
||||
"zulip-ios-legacy": "",
|
||||
"zulip-android": "",
|
||||
};
|
||||
|
||||
// Remember the loaded repositories so that HTML is not redundantly edited
|
||||
// if a user leaves and then revisits the same tab.
|
||||
const loaded_repos = [];
|
||||
|
||||
function contrib_total_commits(contrib) {
|
||||
function contrib_total_commits(contributor) {
|
||||
let commits = 0;
|
||||
repos.concat(hidden_repos).forEach((repo) => {
|
||||
commits += contrib[repo] || 0;
|
||||
Object.keys(repo_name_to_tab_name).forEach((repo_name) => {
|
||||
commits += contributor[repo_name] || 0;
|
||||
});
|
||||
return commits;
|
||||
}
|
||||
|
@ -35,9 +34,9 @@ export default function render_tabs() {
|
|||
// contributors who have atleast the same number of contributions than the last contributor
|
||||
// returned by the API for zulip/zulip repo.
|
||||
const least_server_commits = _.chain(contributors_list)
|
||||
.filter("server")
|
||||
.sortBy("server")
|
||||
.value()[0].server;
|
||||
.filter("zulip")
|
||||
.sortBy("zulip")
|
||||
.value()[0].zulip;
|
||||
|
||||
const total_tab_html = _.chain(contributors_list)
|
||||
.map((c) => ({
|
||||
|
@ -54,29 +53,33 @@ export default function render_tabs() {
|
|||
|
||||
$("#tab-total").html(total_tab_html);
|
||||
|
||||
for (const repo of repos) {
|
||||
for (const repo_name of Object.keys(repo_name_to_tab_name)) {
|
||||
const tab_name = repo_name_to_tab_name[repo_name];
|
||||
if (!tab_name) {
|
||||
continue;
|
||||
}
|
||||
// Set as the loading template for now, and load when clicked.
|
||||
$("#tab-" + repo).html($("#loading-template").html());
|
||||
$("#tab-" + tab_name).html($("#loading-template").html());
|
||||
|
||||
$("#" + repo).on("click", () => {
|
||||
if (!loaded_repos.includes(repo)) {
|
||||
$("#" + tab_name).on("click", () => {
|
||||
if (!loaded_repos.includes(repo_name)) {
|
||||
const html = _.chain(contributors_list)
|
||||
.filter(repo)
|
||||
.sortBy(repo)
|
||||
.filter(repo_name)
|
||||
.sortBy(repo_name)
|
||||
.reverse()
|
||||
.map((c) =>
|
||||
template({
|
||||
name: c.name,
|
||||
avatar: c.avatar,
|
||||
commits: c[repo],
|
||||
commits: c[repo_name],
|
||||
}),
|
||||
)
|
||||
.value()
|
||||
.join("");
|
||||
|
||||
$("#tab-" + repo).html(html);
|
||||
$("#tab-" + tab_name).html(html);
|
||||
|
||||
loaded_repos.push(repo);
|
||||
loaded_repos.push(repo_name);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -48,13 +48,15 @@ class Contributor(TypedDict):
|
|||
|
||||
logger = logging.getLogger('zulip.fetch_contributors_json')
|
||||
|
||||
def fetch_contributors(repo_link: str, max_retries: int) -> List[Contributor]:
|
||||
def fetch_contributors(repo_name: str, max_retries: int) -> List[Contributor]:
|
||||
contributors: List[Contributor] = []
|
||||
retry_attempts = 0
|
||||
page_index = 1
|
||||
|
||||
api_link = f"https://api.github.com/repos/zulip/{repo_name}/contributors"
|
||||
|
||||
while True:
|
||||
response: requests.Response = requests.get(f"{repo_link}?page={page_index}", verify=os.environ.get('CUSTOM_CA_CERTIFICATES'))
|
||||
response: requests.Response = requests.get(f"{api_link}?page={page_index}", verify=os.environ.get('CUSTOM_CA_CERTIFICATES'))
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
if len(data) == 0:
|
||||
|
@ -77,41 +79,26 @@ def write_to_disk(json_data: ContributorsJSON, out_file: str) -> None:
|
|||
f.write("\n")
|
||||
|
||||
def update_contributor_data_file() -> None:
|
||||
"""
|
||||
Get contributors data from Github and insert them into a temporary
|
||||
dictionary. Retry fetching each repository if responded with non HTTP 200
|
||||
status.
|
||||
"""
|
||||
|
||||
# This dictionary should hold all repositories that should be included in
|
||||
# This list should hold all repositories that should be included in
|
||||
# the total count, including those that should *not* have tabs on the team
|
||||
# page (e.g. if they are deprecated).
|
||||
repositories = {
|
||||
'server': 'https://api.github.com/repos/zulip/zulip/contributors',
|
||||
'desktop': 'https://api.github.com/repos/zulip/zulip-desktop/contributors',
|
||||
'mobile': 'https://api.github.com/repos/zulip/zulip-mobile/contributors',
|
||||
'python-zulip-api': 'https://api.github.com/repos/zulip/python-zulip-api/contributors',
|
||||
'zulip-js': 'https://api.github.com/repos/zulip/zulip-js/contributors',
|
||||
'zulipbot': 'https://api.github.com/repos/zulip/zulipbot/contributors',
|
||||
'terminal': 'https://api.github.com/repos/zulip/zulip-terminal/contributors',
|
||||
'zulip-ios-legacy': 'https://api.github.com/repos/zulip/zulip-ios-legacy/contributors',
|
||||
'zulip-android': 'https://api.github.com/repos/zulip/zulip-android/contributors',
|
||||
}
|
||||
repo_names = ['zulip', 'zulip-desktop', 'zulip-mobile', 'python-zulip-api', 'zulip-js', 'zulipbot',
|
||||
'zulip-terminal', 'zulip-ios-legacy', 'zulip-android']
|
||||
|
||||
data: ContributorsJSON = dict(date=str(date.today()), contrib=[])
|
||||
contribs_list: Dict[str, Dict[str, Union[str, int]]] = {}
|
||||
|
||||
for name, link in repositories.items():
|
||||
contributors = fetch_contributors(link, args.max_retries)
|
||||
for repo_name in repo_names:
|
||||
contributors = fetch_contributors(repo_name, args.max_retries)
|
||||
for contributor in contributors:
|
||||
username = contributor['login']
|
||||
if username in contribs_list:
|
||||
contribs_list[username][name] = contributor['contributions']
|
||||
contribs_list[username][repo_name] = contributor['contributions']
|
||||
else:
|
||||
contribs_list[username] = {
|
||||
'avatar': contributor['avatar_url'],
|
||||
'name': username,
|
||||
name: contributor['contributions']
|
||||
repo_name: contributor['contributions']
|
||||
}
|
||||
|
||||
# remove duplicate contributions count
|
||||
|
|
Loading…
Reference in New Issue