Spaces:
Running
Running
luke0709 commited on
Commit ·
d3a5002
1
Parent(s): 0c6f947
Fix
Browse files- DATASETS.md +1 -1
- front/data/benchmark.json → benchmark.json +0 -0
- front/config.mjs → config.mjs +1 -1
- front/data.mjs → data.mjs +0 -0
- index.html +1 -1
- front/leaderboard.mjs → leaderboard.mjs +0 -0
- tests/test_static_space.py +17 -9
- upload_space.py +5 -5
DATASETS.md
CHANGED
|
@@ -87,7 +87,7 @@ hf upload DoolyKim22/Sovereign-Benchmark \
|
|
| 87 |
```
|
| 88 |
|
| 89 |
이미지는 annotation에서 참조하는 상대 경로를 유지하여 함께 업로드합니다.
|
| 90 |
-
`static-space/
|
| 91 |
현재 이 작업 폴더에서 다섯 항목의 원본 위치는 확인되지 않았습니다.
|
| 92 |
원본 경로를 확인한 뒤 배포 폴더를 구성하고 이미지 참조와 데이터 형식을 검증해야 합니다.
|
| 93 |
|
|
|
|
| 87 |
```
|
| 88 |
|
| 89 |
이미지는 annotation에서 참조하는 상대 경로를 유지하여 함께 업로드합니다.
|
| 90 |
+
`static-space/benchmark.json`은 모델별 점수 파일이며 평가 원본이 아닙니다.
|
| 91 |
현재 이 작업 폴더에서 다섯 항목의 원본 위치는 확인되지 않았습니다.
|
| 92 |
원본 경로를 확인한 뒤 배포 폴더를 구성하고 이미지 참조와 데이터 형식을 검증해야 합니다.
|
| 93 |
|
front/data/benchmark.json → benchmark.json
RENAMED
|
File without changes
|
front/config.mjs → config.mjs
RENAMED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
// Public browser configuration. Never put Hugging Face tokens here.
|
| 2 |
export const config = {
|
| 3 |
// Relative to this file. An absolute, public HTTPS JSON URL also works.
|
| 4 |
-
dataUrl: new URL('./
|
| 5 |
requestTimeoutMs: 15000,
|
| 6 |
};
|
|
|
|
| 1 |
// Public browser configuration. Never put Hugging Face tokens here.
|
| 2 |
export const config = {
|
| 3 |
// Relative to this file. An absolute, public HTTPS JSON URL also works.
|
| 4 |
+
dataUrl: new URL('./benchmark.json', import.meta.url).href,
|
| 5 |
requestTimeoutMs: 15000,
|
| 6 |
};
|
front/data.mjs → data.mjs
RENAMED
|
File without changes
|
index.html
CHANGED
|
@@ -258,6 +258,6 @@
|
|
| 258 |
<div class="rounded-xl bg-slate-900 text-white px-4 py-2 shadow-lg">✅ <span id="toastMsg">Done</span></div>
|
| 259 |
</div>
|
| 260 |
|
| 261 |
-
<script type="module" src="./
|
| 262 |
</body>
|
| 263 |
</html>
|
|
|
|
| 258 |
<div class="rounded-xl bg-slate-900 text-white px-4 py-2 shadow-lg">✅ <span id="toastMsg">Done</span></div>
|
| 259 |
</div>
|
| 260 |
|
| 261 |
+
<script type="module" src="./leaderboard.mjs"></script>
|
| 262 |
</body>
|
| 263 |
</html>
|
front/leaderboard.mjs → leaderboard.mjs
RENAMED
|
File without changes
|
tests/test_static_space.py
CHANGED
|
@@ -18,10 +18,18 @@ import unittest
|
|
| 18 |
from playwright.sync_api import sync_playwright
|
| 19 |
|
| 20 |
ROOT = Path(__file__).resolve().parents[1]
|
| 21 |
-
SNAPSHOT = json.loads((ROOT / '
|
| 22 |
|
| 23 |
|
| 24 |
class QuietHandler(SimpleHTTPRequestHandler):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
def log_message(self, *args):
|
| 26 |
pass
|
| 27 |
|
|
@@ -64,7 +72,7 @@ class StaticSpaceTests(unittest.TestCase):
|
|
| 64 |
self.page.wait_for_selector('#dataStatus[data-state="' + state + '"]')
|
| 65 |
|
| 66 |
def refresh(self, state='ready', mobile=False):
|
| 67 |
-
with self.page.expect_response('**/
|
| 68 |
self.page.locator('#refreshMobileBtn' if mobile else '#refreshBtn').click()
|
| 69 |
self.page.wait_for_selector('#dataStatus[data-state="' + state + '"]')
|
| 70 |
|
|
@@ -117,19 +125,19 @@ class StaticSpaceTests(unittest.TestCase):
|
|
| 117 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '1')
|
| 118 |
|
| 119 |
def test_initial_failure_never_invents_results_and_retry_recovers(self):
|
| 120 |
-
self.page.route('**/
|
| 121 |
self.open('error')
|
| 122 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '—')
|
| 123 |
self.assertEqual(self.page.locator('button[data-fav]').count(), 0)
|
| 124 |
self.assertTrue(self.page.locator('#exportCsvBtn').is_disabled())
|
| 125 |
-
self.page.unroute('**/
|
| 126 |
self.refresh()
|
| 127 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), str(len(SNAPSHOT['models'])))
|
| 128 |
|
| 129 |
def test_malformed_refresh_preserves_previous_results(self):
|
| 130 |
self.open()
|
| 131 |
before = self.page.locator('#tableBody').inner_text()
|
| 132 |
-
self.page.route('**/
|
| 133 |
content_type='application/json', body='{"models":[{"provider":"Broken"}]}'))
|
| 134 |
self.refresh('error')
|
| 135 |
self.assertEqual(self.page.locator('#tableBody').inner_text(), before)
|
|
@@ -158,17 +166,17 @@ class StaticSpaceTests(unittest.TestCase):
|
|
| 158 |
self.page.locator('#themeToggle').click()
|
| 159 |
|
| 160 |
def test_empty_results_and_untrusted_labels(self):
|
| 161 |
-
self.page.route('**/
|
| 162 |
content_type='application/json', body='{"models":[],"datasets":[]}'))
|
| 163 |
self.open()
|
| 164 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '0')
|
| 165 |
self.assertIn('No results have been published', self.page.locator('#tableBody').inner_text())
|
| 166 |
-
self.page.unroute('**/
|
| 167 |
label = '<img src=x onerror="window.injected=true">'
|
| 168 |
payload = {'datasets': [label], 'models': [{
|
| 169 |
'provider': label, 'name': label, 'repo': label, 'is_multimodal': True,
|
| 170 |
'scores': [{'dataset_name': label, 'score': 42, 'metric_type': 'raw'}]}]}
|
| 171 |
-
self.page.route('**/
|
| 172 |
content_type='application/json', body=json.dumps(payload)))
|
| 173 |
self.refresh()
|
| 174 |
self.page.locator('#selectAllBtn').click()
|
|
@@ -179,7 +187,7 @@ class StaticSpaceTests(unittest.TestCase):
|
|
| 179 |
def test_legacy_array_validation_and_request_timeout(self):
|
| 180 |
self.open()
|
| 181 |
result = self.page.evaluate('''async () => {
|
| 182 |
-
const {normalizeBenchmark, loadBenchmark} = await import('/
|
| 183 |
const legacy = normalizeBenchmark([{provider: 'P', name: 'M', scores: [
|
| 184 |
{dataset_name: 'Additional', score: 0}]}]);
|
| 185 |
let invalid = 0;
|
|
|
|
| 18 |
from playwright.sync_api import sync_playwright
|
| 19 |
|
| 20 |
ROOT = Path(__file__).resolve().parents[1]
|
| 21 |
+
SNAPSHOT = json.loads((ROOT / 'benchmark.json').read_text())
|
| 22 |
|
| 23 |
|
| 24 |
class QuietHandler(SimpleHTTPRequestHandler):
|
| 25 |
+
def do_GET(self):
|
| 26 |
+
# Reproduce the live Space failure: /front/ URLs return 404 even
|
| 27 |
+
# though those files exist in the repository.
|
| 28 |
+
if self.path.startswith('/front/'):
|
| 29 |
+
self.send_error(404)
|
| 30 |
+
return
|
| 31 |
+
super().do_GET()
|
| 32 |
+
|
| 33 |
def log_message(self, *args):
|
| 34 |
pass
|
| 35 |
|
|
|
|
| 72 |
self.page.wait_for_selector('#dataStatus[data-state="' + state + '"]')
|
| 73 |
|
| 74 |
def refresh(self, state='ready', mobile=False):
|
| 75 |
+
with self.page.expect_response('**/benchmark.json'):
|
| 76 |
self.page.locator('#refreshMobileBtn' if mobile else '#refreshBtn').click()
|
| 77 |
self.page.wait_for_selector('#dataStatus[data-state="' + state + '"]')
|
| 78 |
|
|
|
|
| 125 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '1')
|
| 126 |
|
| 127 |
def test_initial_failure_never_invents_results_and_retry_recovers(self):
|
| 128 |
+
self.page.route('**/benchmark.json', lambda route: route.fulfill(status=503, body='Unavailable'))
|
| 129 |
self.open('error')
|
| 130 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '—')
|
| 131 |
self.assertEqual(self.page.locator('button[data-fav]').count(), 0)
|
| 132 |
self.assertTrue(self.page.locator('#exportCsvBtn').is_disabled())
|
| 133 |
+
self.page.unroute('**/benchmark.json')
|
| 134 |
self.refresh()
|
| 135 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), str(len(SNAPSHOT['models'])))
|
| 136 |
|
| 137 |
def test_malformed_refresh_preserves_previous_results(self):
|
| 138 |
self.open()
|
| 139 |
before = self.page.locator('#tableBody').inner_text()
|
| 140 |
+
self.page.route('**/benchmark.json', lambda route: route.fulfill(
|
| 141 |
content_type='application/json', body='{"models":[{"provider":"Broken"}]}'))
|
| 142 |
self.refresh('error')
|
| 143 |
self.assertEqual(self.page.locator('#tableBody').inner_text(), before)
|
|
|
|
| 166 |
self.page.locator('#themeToggle').click()
|
| 167 |
|
| 168 |
def test_empty_results_and_untrusted_labels(self):
|
| 169 |
+
self.page.route('**/benchmark.json', lambda route: route.fulfill(
|
| 170 |
content_type='application/json', body='{"models":[],"datasets":[]}'))
|
| 171 |
self.open()
|
| 172 |
self.assertEqual(self.page.locator('#kpiModels').inner_text(), '0')
|
| 173 |
self.assertIn('No results have been published', self.page.locator('#tableBody').inner_text())
|
| 174 |
+
self.page.unroute('**/benchmark.json')
|
| 175 |
label = '<img src=x onerror="window.injected=true">'
|
| 176 |
payload = {'datasets': [label], 'models': [{
|
| 177 |
'provider': label, 'name': label, 'repo': label, 'is_multimodal': True,
|
| 178 |
'scores': [{'dataset_name': label, 'score': 42, 'metric_type': 'raw'}]}]}
|
| 179 |
+
self.page.route('**/benchmark.json', lambda route: route.fulfill(
|
| 180 |
content_type='application/json', body=json.dumps(payload)))
|
| 181 |
self.refresh()
|
| 182 |
self.page.locator('#selectAllBtn').click()
|
|
|
|
| 187 |
def test_legacy_array_validation_and_request_timeout(self):
|
| 188 |
self.open()
|
| 189 |
result = self.page.evaluate('''async () => {
|
| 190 |
+
const {normalizeBenchmark, loadBenchmark} = await import('/data.mjs');
|
| 191 |
const legacy = normalizeBenchmark([{provider: 'P', name: 'M', scores: [
|
| 192 |
{dataset_name: 'Additional', score: 0}]}]);
|
| 193 |
let invalid = 0;
|
upload_space.py
CHANGED
|
@@ -11,10 +11,10 @@ FILES = [
|
|
| 11 |
'.gitignore',
|
| 12 |
'README.md',
|
| 13 |
'index.html',
|
| 14 |
-
'
|
| 15 |
-
'
|
| 16 |
-
'
|
| 17 |
-
'
|
| 18 |
'tests/test_static_space.py',
|
| 19 |
'upload_space.py',
|
| 20 |
]
|
|
@@ -22,7 +22,7 @@ FILES = [
|
|
| 22 |
|
| 23 |
def main():
|
| 24 |
parser = argparse.ArgumentParser(description=__doc__)
|
| 25 |
-
parser.add_argument('--repo-id', default='
|
| 26 |
parser.add_argument('--message', default='Update static benchmark leaderboard')
|
| 27 |
args = parser.parse_args()
|
| 28 |
|
|
|
|
| 11 |
'.gitignore',
|
| 12 |
'README.md',
|
| 13 |
'index.html',
|
| 14 |
+
'config.mjs',
|
| 15 |
+
'data.mjs',
|
| 16 |
+
'leaderboard.mjs',
|
| 17 |
+
'benchmark.json',
|
| 18 |
'tests/test_static_space.py',
|
| 19 |
'upload_space.py',
|
| 20 |
]
|
|
|
|
| 22 |
|
| 23 |
def main():
|
| 24 |
parser = argparse.ArgumentParser(description=__doc__)
|
| 25 |
+
parser.add_argument('--repo-id', default='KETI-NLP/K-Prism_Benchmark')
|
| 26 |
parser.add_argument('--message', default='Update static benchmark leaderboard')
|
| 27 |
args = parser.parse_args()
|
| 28 |
|