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 |
}
|