Spaces:
Runtime error
Runtime error
External libraries
Browse files
app.py
CHANGED
@@ -17,7 +17,13 @@ HfFolder.save_token(HF_TOKEN)
|
|
17 |
datasets = {
|
18 |
"stars": load_dataset("open-source-metrics/stars").sort('dates'),
|
19 |
"issues": load_dataset("open-source-metrics/issues").sort('dates'),
|
20 |
-
"pip": load_dataset("open-source-metrics/pip").sort('day')
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
}
|
22 |
|
23 |
val = 0
|
@@ -45,11 +51,18 @@ def _ignore_org_members(e):
|
|
45 |
|
46 |
return e
|
47 |
|
|
|
48 |
stars = {}
|
49 |
for k, v in datasets['stars'].items():
|
50 |
stars[k] = v.map(_range)
|
51 |
val = 0
|
52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
issues = {}
|
54 |
for k, v in datasets['issues'].items():
|
55 |
issues[k] = v.map(_range)
|
@@ -57,15 +70,18 @@ for k, v in datasets['issues'].items():
|
|
57 |
issues[k] = issues[k].map(_ignore_org_members)
|
58 |
val = 0
|
59 |
|
60 |
-
datasets['stars'] = DatasetDict(**stars)
|
61 |
-
datasets['issues'] = DatasetDict(**issues)
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
# }
|
69 |
|
70 |
|
71 |
def link_values(library_names, returned_values):
|
@@ -108,25 +124,54 @@ class RequestHandler(SimpleHTTPRequestHandler):
|
|
108 |
if self.path.startswith("/initialize"):
|
109 |
dataset_keys = {k: set(v.keys()) for k, v in datasets.items()}
|
110 |
dataset_with_most_splits = max([d for d in dataset_keys.values()], key=len)
|
|
|
|
|
|
|
|
|
111 |
warnings = []
|
112 |
|
113 |
for k, v in dataset_keys.items():
|
114 |
if len(v) < len(dataset_with_most_splits):
|
115 |
-
warnings.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
|
117 |
-
# TODO: Send and display warnings
|
118 |
dataset_with_most_splits = list(dataset_with_most_splits)
|
119 |
dataset_with_most_splits.sort()
|
120 |
|
121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
|
123 |
if self.path.startswith("/retrievePipInstalls"):
|
|
|
124 |
library_names, options = parse_name_and_options(self.path)
|
125 |
|
126 |
if '1' in options:
|
127 |
returned_values = {}
|
128 |
for library_name in library_names:
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
if i['day'] in returned_values:
|
131 |
returned_values[i['day']]['Cumulated'] += i['num_downloads']
|
132 |
else:
|
@@ -137,7 +182,16 @@ class RequestHandler(SimpleHTTPRequestHandler):
|
|
137 |
else:
|
138 |
returned_values = {}
|
139 |
for library_name in library_names:
|
140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
if i['day'] in returned_values:
|
142 |
returned_values[i['day']][library_name] = i['num_downloads']
|
143 |
else:
|
@@ -155,13 +209,21 @@ class RequestHandler(SimpleHTTPRequestHandler):
|
|
155 |
return self.response(output)
|
156 |
|
157 |
if self.path.startswith("/retrieveStars"):
|
|
|
158 |
library_names, options = parse_name_and_options(self.path)
|
159 |
returned_values = {}
|
160 |
dataset_dict = datasets['stars']
|
|
|
161 |
week_over_week = '1' in options
|
162 |
|
163 |
for library_name in library_names:
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
|
166 |
last_value = 0
|
167 |
last_week = dataset[0]['week']
|
@@ -188,6 +250,7 @@ class RequestHandler(SimpleHTTPRequestHandler):
|
|
188 |
|
189 |
|
190 |
if self.path.startswith("/retrieveIssues"):
|
|
|
191 |
library_names, options = parse_name_and_options(self.path)
|
192 |
|
193 |
exclude_org_members = '1' in options
|
@@ -195,10 +258,17 @@ class RequestHandler(SimpleHTTPRequestHandler):
|
|
195 |
|
196 |
returned_values = {}
|
197 |
dataset_dict = datasets['issues']
|
|
|
198 |
range_id = 'range' if not exclude_org_members else 'range_non_org'
|
199 |
|
200 |
for library_name in library_names:
|
201 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
|
203 |
last_value = 0
|
204 |
last_week = dataset[0]['week']
|
|
|
17 |
datasets = {
|
18 |
"stars": load_dataset("open-source-metrics/stars").sort('dates'),
|
19 |
"issues": load_dataset("open-source-metrics/issues").sort('dates'),
|
20 |
+
"pip": load_dataset("open-source-metrics/pip").sort('day'),
|
21 |
+
}
|
22 |
+
|
23 |
+
external_datasets = {
|
24 |
+
"stars": load_dataset("open-source-metrics/stars-external").sort('dates'),
|
25 |
+
"issues": load_dataset("open-source-metrics/issues-external").sort('dates'),
|
26 |
+
"pip": load_dataset("open-source-metrics/pip-external").sort('day')
|
27 |
}
|
28 |
|
29 |
val = 0
|
|
|
51 |
|
52 |
return e
|
53 |
|
54 |
+
|
55 |
stars = {}
|
56 |
for k, v in datasets['stars'].items():
|
57 |
stars[k] = v.map(_range)
|
58 |
val = 0
|
59 |
|
60 |
+
stars_external = {}
|
61 |
+
for k, v in external_datasets['stars'].items():
|
62 |
+
stars_external[k] = v.map(_range)
|
63 |
+
val = 0
|
64 |
+
|
65 |
+
|
66 |
issues = {}
|
67 |
for k, v in datasets['issues'].items():
|
68 |
issues[k] = v.map(_range)
|
|
|
70 |
issues[k] = issues[k].map(_ignore_org_members)
|
71 |
val = 0
|
72 |
|
|
|
|
|
73 |
|
74 |
+
issues_external = {}
|
75 |
+
for k, v in external_datasets['issues'].items():
|
76 |
+
issues_external[k] = v.map(_range)
|
77 |
+
val = 0
|
78 |
+
issues_external[k] = issues_external[k].map(_ignore_org_members)
|
79 |
+
val = 0
|
80 |
|
81 |
+
datasets['stars'] = DatasetDict(**stars)
|
82 |
+
datasets['issues'] = DatasetDict(**issues)
|
83 |
+
external_datasets['stars'] = DatasetDict(**stars_external)
|
84 |
+
external_datasets['issues'] = DatasetDict(**issues_external)
|
|
|
85 |
|
86 |
|
87 |
def link_values(library_names, returned_values):
|
|
|
124 |
if self.path.startswith("/initialize"):
|
125 |
dataset_keys = {k: set(v.keys()) for k, v in datasets.items()}
|
126 |
dataset_with_most_splits = max([d for d in dataset_keys.values()], key=len)
|
127 |
+
|
128 |
+
external_dataset_keys = {k: set(v.keys()) for k, v in external_datasets.items()}
|
129 |
+
external_dataset_with_most_splits = max([d for d in external_dataset_keys.values()], key=len)
|
130 |
+
|
131 |
warnings = []
|
132 |
|
133 |
for k, v in dataset_keys.items():
|
134 |
if len(v) < len(dataset_with_most_splits):
|
135 |
+
warnings.append(
|
136 |
+
f"The {k} dataset does not contain all splits. Missing: {dataset_with_most_splits - v}."
|
137 |
+
f"\nSelecting that split to show the pip install numbers will not work."
|
138 |
+
)
|
139 |
+
|
140 |
+
for k, v in external_dataset_keys.items():
|
141 |
+
if len(v) < len(external_dataset_with_most_splits):
|
142 |
+
warnings.append(
|
143 |
+
f"The {k} dataset does not contain all splits. Missing: {external_dataset_with_most_splits - v}"
|
144 |
+
f".\nSelecting that split to show the pip install numbers will not work."
|
145 |
+
)
|
146 |
|
|
|
147 |
dataset_with_most_splits = list(dataset_with_most_splits)
|
148 |
dataset_with_most_splits.sort()
|
149 |
|
150 |
+
external_dataset_with_most_splits = list(external_dataset_with_most_splits)
|
151 |
+
external_dataset_with_most_splits.sort()
|
152 |
+
|
153 |
+
return self.response({
|
154 |
+
'internal': list(dataset_with_most_splits),
|
155 |
+
'external': external_dataset_with_most_splits,
|
156 |
+
'warnings': warnings
|
157 |
+
})
|
158 |
|
159 |
if self.path.startswith("/retrievePipInstalls"):
|
160 |
+
errors = []
|
161 |
library_names, options = parse_name_and_options(self.path)
|
162 |
|
163 |
if '1' in options:
|
164 |
returned_values = {}
|
165 |
for library_name in library_names:
|
166 |
+
ds = None
|
167 |
+
if library_name in datasets['pip']:
|
168 |
+
ds = datasets['pip'][library_name]
|
169 |
+
elif library_name in external_datasets['pip']:
|
170 |
+
ds = external_datasets['pip'][library_name]
|
171 |
+
else:
|
172 |
+
errors.append(f"No {library_name} found in internal or external datasets.")
|
173 |
+
|
174 |
+
for i in ds:
|
175 |
if i['day'] in returned_values:
|
176 |
returned_values[i['day']]['Cumulated'] += i['num_downloads']
|
177 |
else:
|
|
|
182 |
else:
|
183 |
returned_values = {}
|
184 |
for library_name in library_names:
|
185 |
+
|
186 |
+
if library_name in datasets['pip']:
|
187 |
+
ds = datasets['pip'][library_name]
|
188 |
+
elif library_name in external_datasets['pip']:
|
189 |
+
ds = external_datasets['pip'][library_name]
|
190 |
+
else:
|
191 |
+
errors.append(f"No {library_name} found in internal or external datasets for pip.")
|
192 |
+
return {'errors': errors}
|
193 |
+
|
194 |
+
for i in ds:
|
195 |
if i['day'] in returned_values:
|
196 |
returned_values[i['day']][library_name] = i['num_downloads']
|
197 |
else:
|
|
|
209 |
return self.response(output)
|
210 |
|
211 |
if self.path.startswith("/retrieveStars"):
|
212 |
+
errors = []
|
213 |
library_names, options = parse_name_and_options(self.path)
|
214 |
returned_values = {}
|
215 |
dataset_dict = datasets['stars']
|
216 |
+
external_dataset_dict = external_datasets['stars']
|
217 |
week_over_week = '1' in options
|
218 |
|
219 |
for library_name in library_names:
|
220 |
+
if library_name in dataset_dict:
|
221 |
+
dataset = dataset_dict[library_name]
|
222 |
+
elif library_name in external_dataset_dict:
|
223 |
+
dataset = external_dataset_dict[library_name]
|
224 |
+
else:
|
225 |
+
errors.append(f"No {library_name} found in internal or external datasets for stars.")
|
226 |
+
return {'errors': errors}
|
227 |
|
228 |
last_value = 0
|
229 |
last_week = dataset[0]['week']
|
|
|
250 |
|
251 |
|
252 |
if self.path.startswith("/retrieveIssues"):
|
253 |
+
errors = []
|
254 |
library_names, options = parse_name_and_options(self.path)
|
255 |
|
256 |
exclude_org_members = '1' in options
|
|
|
258 |
|
259 |
returned_values = {}
|
260 |
dataset_dict = datasets['issues']
|
261 |
+
external_dataset_dict = external_datasets['issues']
|
262 |
range_id = 'range' if not exclude_org_members else 'range_non_org'
|
263 |
|
264 |
for library_name in library_names:
|
265 |
+
if library_name in dataset_dict:
|
266 |
+
dataset = dataset_dict[library_name]
|
267 |
+
elif library_name in external_dataset_dict:
|
268 |
+
dataset = external_dataset_dict[library_name]
|
269 |
+
else:
|
270 |
+
errors.append(f"No {library_name} found in internal or external datasets for stars.")
|
271 |
+
return {'errors': errors}
|
272 |
|
273 |
last_value = 0
|
274 |
last_week = dataset[0]['week']
|
index.html
CHANGED
@@ -10,6 +10,7 @@
|
|
10 |
</head>
|
11 |
|
12 |
<body>
|
|
|
13 |
<div id="loading"></div>
|
14 |
<div class="graphs">
|
15 |
<div id="library-selector"></div>
|
|
|
10 |
</head>
|
11 |
|
12 |
<body>
|
13 |
+
<div id="warnings"></div>
|
14 |
<div id="loading"></div>
|
15 |
<div class="graphs">
|
16 |
<div id="library-selector"></div>
|
index.js
CHANGED
@@ -82,7 +82,9 @@ const createButton = (title, libraries, methods) => {
|
|
82 |
document.getElementById('issue-graph').innerHTML = ''
|
83 |
const e = load()
|
84 |
document.body.appendChild(e)
|
85 |
-
const
|
|
|
|
|
86 |
|
87 |
const relevantOptions = getCheckedOptions();
|
88 |
|
@@ -102,8 +104,11 @@ const createButton = (title, libraries, methods) => {
|
|
102 |
|
103 |
const initialize = async () => {
|
104 |
const inferResponse = await fetch(`initialize`);
|
|
|
105 |
const inferJson = await inferResponse.json();
|
106 |
-
|
|
|
|
|
107 |
const librarySelector = document.getElementById('library-selector');
|
108 |
const graphSelector = document.getElementById('graph-selector');
|
109 |
const selectorSubmit = document.getElementById('selector-submit');
|
@@ -116,7 +121,41 @@ const initialize = async () => {
|
|
116 |
graphSpan.textContent = "Select graphs to display"
|
117 |
graphSelector.appendChild(graphSpan);
|
118 |
|
119 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
const div = document.createElement('div');
|
121 |
const checkBox = document.createElement('input');
|
122 |
checkBox.type = 'checkbox'
|
|
|
82 |
document.getElementById('issue-graph').innerHTML = ''
|
83 |
const e = load()
|
84 |
document.body.appendChild(e)
|
85 |
+
const selectedInternalLibraries = libraries.internal.filter(e => document.querySelector(`#${e}Checkbox`).checked);
|
86 |
+
const selectedExternalLibraries = libraries.external.filter(e => document.querySelector(`#${e}Checkbox`).checked);
|
87 |
+
const selectedLibraries = selectedInternalLibraries.concat(selectedExternalLibraries);
|
88 |
|
89 |
const relevantOptions = getCheckedOptions();
|
90 |
|
|
|
104 |
|
105 |
const initialize = async () => {
|
106 |
const inferResponse = await fetch(`initialize`);
|
107 |
+
console.log(inferResponse);
|
108 |
const inferJson = await inferResponse.json();
|
109 |
+
console.log(inferJson);
|
110 |
+
|
111 |
+
const warnings = document.getElementById("warnings")
|
112 |
const librarySelector = document.getElementById('library-selector');
|
113 |
const graphSelector = document.getElementById('graph-selector');
|
114 |
const selectorSubmit = document.getElementById('selector-submit');
|
|
|
121 |
graphSpan.textContent = "Select graphs to display"
|
122 |
graphSelector.appendChild(graphSpan);
|
123 |
|
124 |
+
if (inferJson.warnings.length > 0) {
|
125 |
+
const div = document.createElement('div');
|
126 |
+
div.classList.add('warning-div')
|
127 |
+
|
128 |
+
for (const warning of inferJson.warnings) {
|
129 |
+
const labelSpan = document.createElement('span');
|
130 |
+
labelSpan.textContent = `Warning: ${warning}`;
|
131 |
+
|
132 |
+
div.appendChild(labelSpan);
|
133 |
+
}
|
134 |
+
warnings.appendChild(div);
|
135 |
+
}
|
136 |
+
|
137 |
+
for (const element of inferJson.internal) {
|
138 |
+
const div = document.createElement('div');
|
139 |
+
const checkBox = document.createElement('input');
|
140 |
+
checkBox.type = 'checkbox'
|
141 |
+
checkBox.id = `${element}Checkbox`;
|
142 |
+
|
143 |
+
const checkBoxLabel = document.createElement('label');
|
144 |
+
const labelSpan = document.createElement('span')
|
145 |
+
|
146 |
+
labelSpan.textContent = element.charAt(0).toUpperCase() + element.slice(1)
|
147 |
+
checkBoxLabel.appendChild(checkBox)
|
148 |
+
checkBoxLabel.appendChild(labelSpan)
|
149 |
+
|
150 |
+
div.appendChild(checkBoxLabel)
|
151 |
+
librarySelector.appendChild(div)
|
152 |
+
}
|
153 |
+
|
154 |
+
const externalLibs = document.createElement("h3")
|
155 |
+
externalLibs.textContent = "External Libraries"
|
156 |
+
librarySelector.appendChild(externalLibs);
|
157 |
+
|
158 |
+
for (const element of inferJson.external) {
|
159 |
const div = document.createElement('div');
|
160 |
const checkBox = document.createElement('input');
|
161 |
checkBox.type = 'checkbox'
|
style.css
CHANGED
@@ -52,6 +52,15 @@ button:hover {
|
|
52 |
margin-left: 20px;
|
53 |
}
|
54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
.submit {
|
56 |
margin-bottom: 50px;
|
57 |
}
|
|
|
52 |
margin-left: 20px;
|
53 |
}
|
54 |
|
55 |
+
.warning-div {
|
56 |
+
background-color: rgb(255, 230, 164);
|
57 |
+
border-radius: 10px;
|
58 |
+
border-bottom: 3px solid rgb(235, 210, 144);
|
59 |
+
border-right: 3px solid rgb(235, 210, 144);
|
60 |
+
margin: 10px;
|
61 |
+
padding: 20px;
|
62 |
+
}
|
63 |
+
|
64 |
.submit {
|
65 |
margin-bottom: 50px;
|
66 |
}
|