-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb.py
More file actions
141 lines (112 loc) · 3.77 KB
/
web.py
File metadata and controls
141 lines (112 loc) · 3.77 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import argparse
import copy
import os
from datetime import datetime
import markdown
from confobj import ConfigEnv
from confobj import ConfigJson
from confobj import ConfigYaml
from datasets_lib import Datasets
from datasets_lib import DatasetsConfig
from flask import Flask
from flask import Markup
from flask import g
from flask import render_template
from web_config import WebConfig
app = Flask(__name__)
def get_ds(conf_order=None):
ds = getattr(g, '_ds', None)
if ds is None:
if not conf_order:
conf_order = (ConfigEnv(),)
ds = g._ds = Datasets(DatasetsConfig(order=conf_order))
return ds
def get_conf(conf_order=None):
conf = getattr(g, '_conf', None)
if conf is None:
if not conf_order:
conf_order = (ConfigEnv(),)
conf = g._conf = WebConfig(order=conf_order)
return conf
@app.route("/")
def main():
ds = get_ds()
try:
data = ds.list()
except Exception as e:
return "Server error ({}) {}".format(ds.get_address(), e), 500
# todo support server side sort
data = sorted(data.items(), key=lambda x: x[1]["name"])
return render_template('index.html', data=data)
@app.route('/detail/<ds_id>')
def detail(ds_id: str):
ds = get_ds()
conf = get_conf()
try:
data = ds.project_details(ds_id)
except Exception as e:
return "Server error ({}) {}".format(ds.get_address(), e), 500
process_changelog(data, conf)
process_usages(data, conf)
markdowns = process_markdowns(data)
processed = conf.processed
return render_template('detail.html',
ds=data,
processed=processed,
id=ds_id,
markdowns=markdowns)
def process_changelog(data, conf):
if not ("changelog" in data and data["changelog"]):
return
for i in data["changelog"]:
for c in i:
c[3] = format_date(c[3], conf.date_format)
def process_usages(data, conf):
if not ("usages" in data and data["usages"]):
return
for c, i in enumerate(data["usages"]):
d = copy.deepcopy(i)
del d["timestamp"]
data["usages"][c] = (format_date(i["timestamp"], conf.date_format), d)
def process_markdowns(data):
markdowns = {}
if not ("markdowns" in data and data["markdowns"]):
return markdowns
for m in data["markdowns"]:
try:
# todo not locally
markdowns[m] = Markup(markdown.markdown(open(m).read()))
except Exception as e:
print(e)
return markdowns
def format_date(val: str, date_format: str):
return datetime.fromtimestamp(val).strftime(date_format)
def get_conf_type(path):
if path == "ENV":
return ConfigEnv()
_, ext = os.path.splitext(i)
if ext == ".json":
return ConfigJson(path)
if ext == ".yaml" or ext == ".yml":
return ConfigYaml(path)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-dc', "--datasets-conf", nargs='*')
parser.add_argument('-wc', "--web-conf", nargs='*')
args = parser.parse_args()
datasets_conf_order = []
if args.datasets_conf is not None:
for i in args.datasets_conf:
datasets_conf_order.append(get_conf_type(i))
server_conf_order = []
if args.web_conf is not None:
for i in args.web_conf:
server_conf_order.append(get_conf_type(i))
server_conf_order = tuple(server_conf_order) if server_conf_order else None
datasets_conf_order = tuple(datasets_conf_order) if datasets_conf_order \
else None
with app.app_context():
conf = get_conf(conf_order=server_conf_order)
get_ds(conf_order=datasets_conf_order)
app.run(host=conf.host,
port=conf.port)