File size: 2,865 Bytes
f50f9f2
cb966df
 
 
f50f9f2
cb966df
 
 
b3dc0a7
cb966df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f50f9f2
b3dc0a7
cb966df
b3dc0a7
cb966df
b3dc0a7
 
 
cb966df
b3dc0a7
cb966df
 
 
b3dc0a7
 
 
 
 
 
cb966df
 
 
6124650
 
 
 
b3dc0a7
aa30f9a
cb966df
b3dc0a7
6124650
cb966df
 
b3dc0a7
 
cb966df
aa30f9a
 
 
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
import gradio as gr
import requests
import pandas as pd
import plotly.express as px

class DownloadsTracker:
    def __init__(self):
        self.all_packages = {}
        self.current_packages = []
    
    def fetch_if_needed(self, packages):
        errors = []
        for pkg in packages:
            if pkg not in self.all_packages:
                try:
                    response = requests.get(f"https://pypistats.org/api/packages/{pkg}/overall")
                    if response.status_code != 200:
                        errors.append(f"Package not found: {pkg}")
                        continue
                    
                    data = response.json()["data"]
                    df = pd.DataFrame([
                        {"date": d["date"], "downloads": d["downloads"]} 
                        for d in data if d["category"] == "without_mirrors"
                    ])
                    df["date"] = pd.to_datetime(df["date"])
                    df = df.sort_values("date")
                    df["cumulative_downloads"] = df["downloads"].cumsum()
                    self.all_packages[pkg] = df
                except:
                    errors.append(f"Error fetching {pkg}")
        if len(errors) > 0:
            return "\n".join(errors)
        return None

    def render(self, package_list, use_log_scale):
        package_list = [p.strip() for p in package_list.split(",") if p.strip()]
        self.current_packages = package_list
        errors = self.fetch_if_needed(package_list)
        return self.plot(use_log_scale), errors, gr.update(visible=errors is not None)
    
    def plot(self, use_log_scale):
        fig = px.line(title="Cumulative Package Downloads")
        for pkg in self.current_packages:
            if pkg in self.all_packages:
                df = self.all_packages[pkg]
                fig.add_scatter(x=df["date"], y=df["cumulative_downloads"], name=pkg)
        
        if use_log_scale:
            fig.update_yaxes(type="log")
        else:
            fig.update_yaxes(type="linear")
        return fig

tracker = DownloadsTracker()

css = """
#textbox_id textarea {color: red}
#textbox_id span {background-color: red}
"""

with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
    packages = gr.Textbox("transformers", label="Package names (comma-separated)")
    log_scale = gr.Checkbox(label="Use logarithmic scale on Y-axis", value=False)
    error_box = gr.Textbox(label="Errors:", interactive=False, visible=False, elem_id="textbox_id")
    render_btn = gr.Button("Render")
    plot = gr.Plot()
    render_btn.click(tracker.render, inputs=[packages, log_scale], outputs=[plot, error_box, error_box])
    log_scale.change(tracker.plot, inputs=[log_scale], outputs=[plot])

    demo.load(tracker.render, inputs=[packages, log_scale], outputs=[plot, error_box, error_box])

demo.launch()