File size: 2,489 Bytes
ccc5ec3
 
 
 
 
ec76bbb
ccc5ec3
f867f74
ccc5ec3
 
 
8e229a3
 
ccc5ec3
 
 
f867f74
 
 
 
 
 
 
 
 
 
 
 
ccc5ec3
 
 
 
 
 
ec76bbb
ccc5ec3
f867f74
ccc5ec3
f867f74
 
 
ccc5ec3
 
c543299
ccc5ec3
 
 
ec76bbb
 
 
ccc5ec3
ec76bbb
 
 
 
 
 
f867f74
ec76bbb
 
 
 
c543299
f867f74
 
ccc5ec3
 
 
ec76bbb
 
 
f867f74
ccc5ec3
 
c543299
f867f74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ccc5ec3
f867f74
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
86
87
88
89
90
91
92
import os
import csv
import gradio as gr
from gradio import components
from huggingface_hub import Repository, hf_hub_download
from datetime import datetime


DATASET_REPO_URL = "https://huggingface.co/datasets/sjw/data.csv"
DATASET_REPO_ID = "sjw/data.csv"
DATA_FILENAME = "data.csv"
DIRNAME = "data"
DATA_FILE = os.path.join(DIRNAME, DATA_FILENAME)
HF_TOKEN = os.environ.get("HF_TOKEN")


# overriding/appending to the gradio template
SCRIPT = """
<script>
if (!window.hasBeenRun) {
    window.hasBeenRun = true;
    console.log("should only happen once");
    document.querySelector("button.submit").click();
}
</script>
"""


try:
    hf_hub_download(
        repo_id=DATASET_REPO_ID,
        filename=DATA_FILENAME,
    )
except:
    print("file not found")


repo = Repository(
    local_dir=DIRNAME, 
    clone_from=DATASET_REPO_URL, 
    use_auth_token=HF_TOKEN
)


def generate_html() -> str:
    with open(DATA_FILE) as csvfile:
        reader = csv.DictReader(csvfile)
        rows = []
        for row in reader:
            rows.append(row)
        rows.reverse()
        if len(rows) == 0:
            return "no messages yet"
        else:
            html = "<div class='chatbot'>"
            for row in rows:
                html += "<div>"
                html += f"<span>{row['name']}</span>"
                html += f"<span class='message'>{row['message']}</span>"
                html += "</div>"
            html += "</div>"
            return html


def store_message(name: str, message: str):
    if name and message:
        with open(DATA_FILE, "a") as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=["name", "message", "time"])
            writer.writerow(
                {"name": name, "message": message, "time": str(datetime.now())}
            )
        commit_url = repo.push_to_hub()
    return generate_html()


iface = gr.Interface(
    store_message,
    [
        components.Textbox(placeholder="Your name"),
        components.Textbox(placeholder="Your message", lines=2),
    ],
    "html",
    css="""
    .name {background-color:cornflowerblue;color:white; padding:4px;margin:4px;border-radius:4px; }
    """,
    title="Reading/writing to a HuggingFace dataset repo from Spaces",
    description=f"This is a demo of how to do simple *shared data persistence* in a Gradio Space, backed by a dataset repo.",
    article=f"The dataset repo is [{DATASET_REPO_URL}]({DATASET_REPO_URL})",
    allow_flagging="never"
)

iface.launch()