File size: 2,667 Bytes
41e170e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import os

from app.backend.constant import LEADERBOARD_ICON_MAP

LEADERBOARD_MAP = {}
LI_CSS = []
PAGE_SECTIONS = []


def init_leaderboard():
    data_engine = st.session_state["data_engine"]
    leaderboard_map = {}
    page_sections = []
    li_css = []
    sort_id = 0
    leaderboard_change = False
    page_change = False

    for dataset in data_engine.datasets:
        sort_id += 1
        leaderboard = dataset["leaderboard"]
        name = dataset["name"]

        leaderboard_section = f"{leaderboard.capitalize()} Leaderboard"
        if leaderboard_section not in leaderboard_map:
            leaderboard_map[leaderboard_section] = []
        if name.lower() == leaderboard.lower():
            leaderboard_map[leaderboard_section].append((name, 0))
        else:
            leaderboard_map[leaderboard_section].append((name, sort_id))
            li_css.append(f"""
            ul[data-testid="stSidebarNavItems"] li:nth-child({sort_id}) {{
            text-indent: 2rem;
        }}
            """)
        page_name = leaderboard_section if name.lower() == leaderboard.lower() else name.capitalize()
        page_sections.append(f"""
        [[pages]]
        path = "app/ui/pages/{name}.py"
        name = "{page_name}"
        icon = "{LEADERBOARD_ICON_MAP.get(page_name, "")}"
        """)

    # ensure leaderboard is first
    for k, v in leaderboard_map.items():
        v.sort(key=lambda x: x[1])

    if leaderboard_map != LEADERBOARD_MAP:
        LEADERBOARD_MAP.update(leaderboard_map)
        leaderboard_change = True
    if page_sections != PAGE_SECTIONS:
        PAGE_SECTIONS.clear()
        PAGE_SECTIONS.extend(page_sections)
        page_change = True
    if li_css != LI_CSS:
        LI_CSS.clear()
        LI_CSS.extend(li_css)

    return leaderboard_change, page_change


def init_pages(leaderboard_change, page_change):
    # init pages
    if leaderboard_change:
        with open("app/ui/pages/data_page.py", "r", encoding="utf-8") as f:
            data_page = f.read()
        for leaderboard, group_names in LEADERBOARD_MAP.items():

            for group_name in group_names:
                path = os.path.join("app/ui/pages", f"{group_name[0]}.py")
                with open(path, "w", encoding="utf-8") as f:
                    f.write(data_page.replace("$group_name$", group_name[0])
                            )
    if page_change:
        with open("app/ui/pages_sections.toml", "w", encoding="utf-8") as f:
            f.write("\n".join(PAGE_SECTIONS))


if __name__ == '__main__':
    init_leaderboard()
    init_pages()
    print("\n".join(PAGE_SECTIONS))
    print("\n".join(LI_CSS))