Spaces:
Running
Running
Commit
·
5470817
0
Parent(s):
first commit
Browse files- .gitignore +29 -0
- Dockerfile +51 -0
- client/.env.production +1 -0
- client/README.md +8 -0
- client/deps/_metadata.json +8 -0
- client/deps/package.json +3 -0
- client/eslint.config.js +38 -0
- client/index.html +19 -0
- client/package.json +35 -0
- client/public/hf-logo.svg +1 -0
- client/public/vite.svg +1 -0
- client/src/App.css +5 -0
- client/src/App.jsx +101 -0
- client/src/assets/react.svg +1 -0
- client/src/components/Footer/Footer.jsx +30 -0
- client/src/components/LeaderboardCard.jsx +197 -0
- client/src/components/LeaderboardSection.jsx +91 -0
- client/src/components/Logo/Logo.jsx +23 -0
- client/src/components/Navigation/Navigation.jsx +317 -0
- client/src/components/PageHeader/PageHeader.jsx +29 -0
- client/src/config/api.js +1 -0
- client/src/config/theme.js +181 -0
- client/src/hooks/useThemeMode.js +18 -0
- client/src/index.css +37 -0
- client/src/main.jsx +46 -0
- client/src/pages/HowToSubmitPage/HowToSubmitPage.jsx +290 -0
- client/src/pages/LeaderboardPage/LeaderboardPage.jsx +224 -0
- client/vite.config.js +7 -0
- client/yarn.lock +0 -0
- server/.env.example +14 -0
- server/__pycache__/main.cpython-310.pyc +0 -0
- server/__pycache__/server.cpython-310.pyc +0 -0
- server/main.py +5 -0
- server/poetry.lock +929 -0
- server/pyproject.toml +19 -0
- server/server.py +96 -0
.gitignore
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Logs
|
2 |
+
logs
|
3 |
+
*.log
|
4 |
+
npm-debug.log*
|
5 |
+
yarn-debug.log*
|
6 |
+
yarn-error.log*
|
7 |
+
pnpm-debug.log*
|
8 |
+
lerna-debug.log*
|
9 |
+
|
10 |
+
client/node_modules
|
11 |
+
client/dist
|
12 |
+
client/dist-ssr
|
13 |
+
client/*.local
|
14 |
+
|
15 |
+
# Editor directories and files
|
16 |
+
.vscode/*
|
17 |
+
!.vscode/extensions.json
|
18 |
+
.idea
|
19 |
+
.DS_Store
|
20 |
+
*.suo
|
21 |
+
*.ntvs*
|
22 |
+
*.njsproj
|
23 |
+
*.sln
|
24 |
+
*.sw?
|
25 |
+
|
26 |
+
.env
|
27 |
+
|
28 |
+
client/.env
|
29 |
+
server/.env
|
Dockerfile
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM node:18 as client-build
|
2 |
+
WORKDIR /app
|
3 |
+
COPY client/package*.json ./
|
4 |
+
RUN npm install
|
5 |
+
COPY client/ ./
|
6 |
+
RUN npm run build
|
7 |
+
|
8 |
+
FROM python:3.9-slim
|
9 |
+
WORKDIR /app
|
10 |
+
|
11 |
+
# Create non-root user
|
12 |
+
RUN useradd -m -u 1000 user
|
13 |
+
|
14 |
+
# Install system dependencies and poetry
|
15 |
+
RUN apt-get update && apt-get install -y \
|
16 |
+
netcat-openbsd \
|
17 |
+
&& rm -rf /var/lib/apt/lists/* \
|
18 |
+
&& pip install poetry
|
19 |
+
|
20 |
+
# Copy and install Python dependencies
|
21 |
+
COPY server/pyproject.toml server/poetry.lock* ./
|
22 |
+
RUN poetry config virtualenvs.create false \
|
23 |
+
&& poetry install --no-interaction --no-ansi --only main
|
24 |
+
|
25 |
+
# Copy server code
|
26 |
+
COPY server/ ./server/
|
27 |
+
|
28 |
+
# Copy client build
|
29 |
+
COPY --from=client-build /app/dist ./static
|
30 |
+
|
31 |
+
# Create FastAPI app with static files support
|
32 |
+
RUN echo 'from fastapi import FastAPI\nfrom fastapi.staticfiles import StaticFiles\nfrom server.server import app\n\n# Mount API routes first\nfrom server.server import app as api_app\napp = FastAPI()\napp.mount("/api", api_app)\n\n# Then mount static files\napp.mount("/", StaticFiles(directory="static", html=True), name="static")\n' > ./server/main.py
|
33 |
+
|
34 |
+
# Environment variables
|
35 |
+
ENV API_HOST=0.0.0.0 \
|
36 |
+
API_PORT=7860 \
|
37 |
+
UPDATE_INTERVAL_MINUTES=15 \
|
38 |
+
HF_TOKEN="" \
|
39 |
+
REPO_ID="tfrere/leaderboard-explorer" \
|
40 |
+
FILE_PATH="final_leaderboards.json"
|
41 |
+
|
42 |
+
# Create cache directory and set permissions
|
43 |
+
RUN mkdir -p /app/cache && chown -R user:user /app/cache
|
44 |
+
|
45 |
+
# Switch to non-root user
|
46 |
+
USER user
|
47 |
+
|
48 |
+
EXPOSE 7860
|
49 |
+
|
50 |
+
# Start the server
|
51 |
+
CMD ["python", "-m", "uvicorn", "server.main:app", "--host", "0.0.0.0", "--port", "7860"]
|
client/.env.production
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
|
client/README.md
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# React + Vite
|
2 |
+
|
3 |
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
4 |
+
|
5 |
+
Currently, two official plugins are available:
|
6 |
+
|
7 |
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
8 |
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
client/deps/_metadata.json
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"hash": "dad2c8bd",
|
3 |
+
"configHash": "82e0a188",
|
4 |
+
"lockfileHash": "e3b0c442",
|
5 |
+
"browserHash": "9b3dc129",
|
6 |
+
"optimized": {},
|
7 |
+
"chunks": {}
|
8 |
+
}
|
client/deps/package.json
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"type": "module"
|
3 |
+
}
|
client/eslint.config.js
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import js from '@eslint/js'
|
2 |
+
import globals from 'globals'
|
3 |
+
import react from 'eslint-plugin-react'
|
4 |
+
import reactHooks from 'eslint-plugin-react-hooks'
|
5 |
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
6 |
+
|
7 |
+
export default [
|
8 |
+
{ ignores: ['dist'] },
|
9 |
+
{
|
10 |
+
files: ['**/*.{js,jsx}'],
|
11 |
+
languageOptions: {
|
12 |
+
ecmaVersion: 2020,
|
13 |
+
globals: globals.browser,
|
14 |
+
parserOptions: {
|
15 |
+
ecmaVersion: 'latest',
|
16 |
+
ecmaFeatures: { jsx: true },
|
17 |
+
sourceType: 'module',
|
18 |
+
},
|
19 |
+
},
|
20 |
+
settings: { react: { version: '18.3' } },
|
21 |
+
plugins: {
|
22 |
+
react,
|
23 |
+
'react-hooks': reactHooks,
|
24 |
+
'react-refresh': reactRefresh,
|
25 |
+
},
|
26 |
+
rules: {
|
27 |
+
...js.configs.recommended.rules,
|
28 |
+
...react.configs.recommended.rules,
|
29 |
+
...react.configs['jsx-runtime'].rules,
|
30 |
+
...reactHooks.configs.recommended.rules,
|
31 |
+
'react/jsx-no-target-blank': 'off',
|
32 |
+
'react-refresh/only-export-components': [
|
33 |
+
'warn',
|
34 |
+
{ allowConstantExport: true },
|
35 |
+
],
|
36 |
+
},
|
37 |
+
},
|
38 |
+
]
|
client/index.html
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8" />
|
5 |
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
7 |
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
8 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
9 |
+
<link
|
10 |
+
href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700;900&display=swap"
|
11 |
+
rel="stylesheet"
|
12 |
+
/>
|
13 |
+
<title>Leaderboards on the Hub</title>
|
14 |
+
</head>
|
15 |
+
<body>
|
16 |
+
<div id="root"></div>
|
17 |
+
<script type="module" src="/src/main.jsx"></script>
|
18 |
+
</body>
|
19 |
+
</html>
|
client/package.json
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "leaderboard-explorer-frontoffice",
|
3 |
+
"private": true,
|
4 |
+
"version": "0.0.0",
|
5 |
+
"type": "module",
|
6 |
+
"scripts": {
|
7 |
+
"dev": "vite",
|
8 |
+
"build": "vite build",
|
9 |
+
"lint": "eslint .",
|
10 |
+
"preview": "vite preview"
|
11 |
+
},
|
12 |
+
"dependencies": {
|
13 |
+
"@emotion/react": "^11.14.0",
|
14 |
+
"@emotion/styled": "^11.14.0",
|
15 |
+
"@mui/icons-material": "^6.4.0",
|
16 |
+
"@mui/material": "^6.4.0",
|
17 |
+
"@tanstack/react-query": "^5.64.1",
|
18 |
+
"axios": "^1.7.9",
|
19 |
+
"react": "^18.3.1",
|
20 |
+
"react-dom": "^18.3.1",
|
21 |
+
"react-router-dom": "^7.1.2"
|
22 |
+
},
|
23 |
+
"devDependencies": {
|
24 |
+
"@eslint/js": "^9.17.0",
|
25 |
+
"@types/react": "^18.3.18",
|
26 |
+
"@types/react-dom": "^18.3.5",
|
27 |
+
"@vitejs/plugin-react": "^4.3.4",
|
28 |
+
"eslint": "^9.17.0",
|
29 |
+
"eslint-plugin-react": "^7.37.2",
|
30 |
+
"eslint-plugin-react-hooks": "^5.0.0",
|
31 |
+
"eslint-plugin-react-refresh": "^0.4.16",
|
32 |
+
"globals": "^15.14.0",
|
33 |
+
"vite": "^6.0.5"
|
34 |
+
}
|
35 |
+
}
|
client/public/hf-logo.svg
ADDED
|
client/public/vite.svg
ADDED
|
client/src/App.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#root {
|
2 |
+
width: 100%;
|
3 |
+
margin: 0;
|
4 |
+
padding: 0;
|
5 |
+
}
|
client/src/App.jsx
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useEffect } from "react";
|
2 |
+
import {
|
3 |
+
HashRouter as Router,
|
4 |
+
Routes,
|
5 |
+
Route,
|
6 |
+
useSearchParams,
|
7 |
+
useLocation,
|
8 |
+
} from "react-router-dom";
|
9 |
+
import { ThemeProvider } from "@mui/material/styles";
|
10 |
+
import { Box, CssBaseline } from "@mui/material";
|
11 |
+
import Navigation from "./components/Navigation/Navigation";
|
12 |
+
import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage";
|
13 |
+
import HowToSubmitPage from "./pages/HowToSubmitPage/HowToSubmitPage";
|
14 |
+
import Footer from "./components/Footer/Footer";
|
15 |
+
import getTheme from "./config/theme";
|
16 |
+
import { useThemeMode } from "./hooks/useThemeMode";
|
17 |
+
|
18 |
+
function UrlHandler() {
|
19 |
+
const location = useLocation();
|
20 |
+
const [searchParams] = useSearchParams();
|
21 |
+
|
22 |
+
useEffect(() => {
|
23 |
+
const isHFSpace = window.location !== window.parent.location;
|
24 |
+
if (!isHFSpace) return;
|
25 |
+
|
26 |
+
const queryString = window.location.search;
|
27 |
+
const hash = window.location.hash;
|
28 |
+
|
29 |
+
window.parent.postMessage(
|
30 |
+
{
|
31 |
+
queryString,
|
32 |
+
hash,
|
33 |
+
},
|
34 |
+
"https://huggingface.co"
|
35 |
+
);
|
36 |
+
}, [location, searchParams]);
|
37 |
+
|
38 |
+
useEffect(() => {
|
39 |
+
const handleHashChange = (event) => {
|
40 |
+
console.log("hash change event", event);
|
41 |
+
};
|
42 |
+
|
43 |
+
window.addEventListener("hashchange", handleHashChange);
|
44 |
+
return () => window.removeEventListener("hashchange", handleHashChange);
|
45 |
+
}, []);
|
46 |
+
|
47 |
+
return null;
|
48 |
+
}
|
49 |
+
|
50 |
+
function App() {
|
51 |
+
const { mode, toggleTheme } = useThemeMode();
|
52 |
+
const theme = getTheme(mode);
|
53 |
+
|
54 |
+
return (
|
55 |
+
<div
|
56 |
+
className="App"
|
57 |
+
style={{
|
58 |
+
height: "100%",
|
59 |
+
width: "100%",
|
60 |
+
WebkitOverflowScrolling: "touch",
|
61 |
+
overflow: "auto",
|
62 |
+
}}
|
63 |
+
>
|
64 |
+
<ThemeProvider theme={theme}>
|
65 |
+
<CssBaseline />
|
66 |
+
<Router>
|
67 |
+
<UrlHandler />
|
68 |
+
<Box
|
69 |
+
sx={{
|
70 |
+
minHeight: "100vh",
|
71 |
+
display: "flex",
|
72 |
+
flexDirection: "column",
|
73 |
+
bgcolor: "background.default",
|
74 |
+
color: "text.primary",
|
75 |
+
}}
|
76 |
+
>
|
77 |
+
<Navigation onToggleTheme={toggleTheme} mode={mode} />
|
78 |
+
<Box
|
79 |
+
sx={{
|
80 |
+
flex: 1,
|
81 |
+
display: "flex",
|
82 |
+
flexDirection: "column",
|
83 |
+
width: "100%",
|
84 |
+
px: 4,
|
85 |
+
pb: 4,
|
86 |
+
}}
|
87 |
+
>
|
88 |
+
<Routes>
|
89 |
+
<Route path="/" element={<LeaderboardPage />} />
|
90 |
+
<Route path="/submit" element={<HowToSubmitPage />} />
|
91 |
+
</Routes>
|
92 |
+
</Box>
|
93 |
+
<Footer />
|
94 |
+
</Box>
|
95 |
+
</Router>
|
96 |
+
</ThemeProvider>
|
97 |
+
</div>
|
98 |
+
);
|
99 |
+
}
|
100 |
+
|
101 |
+
export default App;
|
client/src/assets/react.svg
ADDED
|
client/src/components/Footer/Footer.jsx
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Box, Typography, Link } from "@mui/material";
|
3 |
+
|
4 |
+
const Footer = () => {
|
5 |
+
return (
|
6 |
+
<Box
|
7 |
+
component="footer"
|
8 |
+
sx={{
|
9 |
+
width: "100%",
|
10 |
+
py: 4,
|
11 |
+
textAlign: "center",
|
12 |
+
}}
|
13 |
+
>
|
14 |
+
<Typography variant="body2" color="text.secondary" sx={{ mx: 4 }}>
|
15 |
+
© 2024 Hugging Face - Leaderboards on the hub - Made with 🤗 by the HF
|
16 |
+
team -{" "}
|
17 |
+
<Link
|
18 |
+
href="https://huggingface.co"
|
19 |
+
target="_blank"
|
20 |
+
rel="noopener noreferrer"
|
21 |
+
color="inherit"
|
22 |
+
>
|
23 |
+
huggingface.co
|
24 |
+
</Link>
|
25 |
+
</Typography>
|
26 |
+
</Box>
|
27 |
+
);
|
28 |
+
};
|
29 |
+
|
30 |
+
export default Footer;
|
client/src/components/LeaderboardCard.jsx
ADDED
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Card, CardContent, Typography, Box, Stack } from "@mui/material";
|
3 |
+
import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorder";
|
4 |
+
import { alpha } from "@mui/material/styles";
|
5 |
+
|
6 |
+
const LeaderboardCard = ({ leaderboard }) => {
|
7 |
+
const { card_data, likes, enriched, consolidated_notes, organization } =
|
8 |
+
leaderboard;
|
9 |
+
|
10 |
+
// Fonction pour capitaliser la première lettre
|
11 |
+
const capitalizeFirst = (str) => {
|
12 |
+
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
|
13 |
+
};
|
14 |
+
|
15 |
+
// Fonction pour formater les likes
|
16 |
+
const formatLikes = (count) => {
|
17 |
+
if (count >= 1000) {
|
18 |
+
return (count / 1000).toFixed(2).replace(/\.?0+$/, "") + "k";
|
19 |
+
}
|
20 |
+
return count;
|
21 |
+
};
|
22 |
+
|
23 |
+
// Séparer les emojis s'il y en a plusieurs
|
24 |
+
const emojis = card_data.emoji.trim().split(/\s+/);
|
25 |
+
|
26 |
+
return (
|
27 |
+
<Box
|
28 |
+
component="a"
|
29 |
+
href={`https://huggingface.co/spaces/${leaderboard.id}`}
|
30 |
+
target="_blank"
|
31 |
+
rel="noopener noreferrer"
|
32 |
+
sx={{
|
33 |
+
textDecoration: "none",
|
34 |
+
color: "inherit",
|
35 |
+
display: "block",
|
36 |
+
"&:hover": {
|
37 |
+
opacity: 0.95,
|
38 |
+
},
|
39 |
+
}}
|
40 |
+
>
|
41 |
+
<Stack spacing={1}>
|
42 |
+
<Card
|
43 |
+
elevation={0}
|
44 |
+
sx={{
|
45 |
+
position: "relative",
|
46 |
+
minHeight: 180,
|
47 |
+
background: `linear-gradient(135deg, ${card_data.colorFrom} 0%, ${card_data.colorTo} 100%)`,
|
48 |
+
color: "white",
|
49 |
+
overflow: "visible",
|
50 |
+
"&::after": {
|
51 |
+
content: '""',
|
52 |
+
position: "absolute",
|
53 |
+
top: 0,
|
54 |
+
left: 0,
|
55 |
+
right: 0,
|
56 |
+
bottom: 0,
|
57 |
+
backgroundColor: "rgba(0, 0, 0, 0.1)",
|
58 |
+
pointerEvents: "none",
|
59 |
+
zIndex: 1,
|
60 |
+
},
|
61 |
+
}}
|
62 |
+
>
|
63 |
+
{/* Background Emoji */}
|
64 |
+
<Box
|
65 |
+
sx={{
|
66 |
+
position: "absolute",
|
67 |
+
top: "50%",
|
68 |
+
left: "50%",
|
69 |
+
transform: "translate(-50%, -50%)",
|
70 |
+
fontSize: "3.75rem",
|
71 |
+
opacity: 0.6,
|
72 |
+
pointerEvents: "none",
|
73 |
+
display: "flex",
|
74 |
+
zIndex: 2,
|
75 |
+
}}
|
76 |
+
>
|
77 |
+
{emojis.map((emoji, index) => (
|
78 |
+
<span key={index}>{emoji}</span>
|
79 |
+
))}
|
80 |
+
</Box>
|
81 |
+
|
82 |
+
{/* Header with likes and status */}
|
83 |
+
<Box
|
84 |
+
sx={{
|
85 |
+
position: "absolute",
|
86 |
+
top: 0,
|
87 |
+
left: 0,
|
88 |
+
right: 0,
|
89 |
+
p: 1.5,
|
90 |
+
display: "flex",
|
91 |
+
justifyContent: "space-between",
|
92 |
+
alignItems: "center",
|
93 |
+
zIndex: 2,
|
94 |
+
}}
|
95 |
+
>
|
96 |
+
<Typography
|
97 |
+
variant="body2"
|
98 |
+
sx={{
|
99 |
+
backgroundColor: "rgba(0, 0, 0, 0.1)",
|
100 |
+
px: 1,
|
101 |
+
py: 0.25,
|
102 |
+
borderRadius: 1,
|
103 |
+
fontSize: "0.75rem",
|
104 |
+
}}
|
105 |
+
>
|
106 |
+
{capitalizeFirst(leaderboard.runtime_stage)}
|
107 |
+
</Typography>
|
108 |
+
<Box
|
109 |
+
sx={{
|
110 |
+
display: "flex",
|
111 |
+
alignItems: "center",
|
112 |
+
gap: 0.25,
|
113 |
+
fontSize: "0.75rem",
|
114 |
+
}}
|
115 |
+
>
|
116 |
+
<FavoriteBorderIcon sx={{ fontSize: 16 }} />
|
117 |
+
<Typography variant="body2" sx={{ fontSize: "inherit" }}>
|
118 |
+
{formatLikes(likes)}
|
119 |
+
</Typography>
|
120 |
+
</Box>
|
121 |
+
</Box>
|
122 |
+
|
123 |
+
{/* Footer with author */}
|
124 |
+
<Box
|
125 |
+
sx={{
|
126 |
+
position: "absolute",
|
127 |
+
bottom: 0,
|
128 |
+
left: 0,
|
129 |
+
right: 0,
|
130 |
+
p: 1.5,
|
131 |
+
zIndex: 2,
|
132 |
+
}}
|
133 |
+
>
|
134 |
+
<Typography
|
135 |
+
variant="body2"
|
136 |
+
sx={{
|
137 |
+
fontSize: "0.75rem",
|
138 |
+
opacity: 0.9,
|
139 |
+
}}
|
140 |
+
>
|
141 |
+
by {organization}
|
142 |
+
</Typography>
|
143 |
+
</Box>
|
144 |
+
|
145 |
+
<CardContent
|
146 |
+
sx={{
|
147 |
+
height: "100%",
|
148 |
+
display: "flex",
|
149 |
+
alignItems: "center",
|
150 |
+
justifyContent: "center",
|
151 |
+
position: "absolute",
|
152 |
+
top: "50%",
|
153 |
+
left: "50%",
|
154 |
+
transform: "translate(-50%, -50%)",
|
155 |
+
width: "100%",
|
156 |
+
zIndex: 2,
|
157 |
+
p: 0,
|
158 |
+
"&:last-child": {
|
159 |
+
paddingBottom: 0,
|
160 |
+
},
|
161 |
+
}}
|
162 |
+
>
|
163 |
+
<Typography
|
164 |
+
variant="h6"
|
165 |
+
component="h2"
|
166 |
+
align="center"
|
167 |
+
sx={{
|
168 |
+
fontSize: "1.25rem",
|
169 |
+
fontWeight: 800,
|
170 |
+
maxWidth: "90%",
|
171 |
+
margin: "0 auto",
|
172 |
+
zIndex: 5,
|
173 |
+
textShadow: "rgba(0, 0, 0, 0.25) 0px 1px 2px",
|
174 |
+
}}
|
175 |
+
>
|
176 |
+
{card_data.title}
|
177 |
+
</Typography>
|
178 |
+
</CardContent>
|
179 |
+
</Card>
|
180 |
+
|
181 |
+
{consolidated_notes && (
|
182 |
+
<Typography
|
183 |
+
variant="body2"
|
184 |
+
sx={{
|
185 |
+
color: "text.secondary",
|
186 |
+
fontSize: "0.875rem",
|
187 |
+
}}
|
188 |
+
>
|
189 |
+
{consolidated_notes}
|
190 |
+
</Typography>
|
191 |
+
)}
|
192 |
+
</Stack>
|
193 |
+
</Box>
|
194 |
+
);
|
195 |
+
};
|
196 |
+
|
197 |
+
export default LeaderboardCard;
|
client/src/components/LeaderboardSection.jsx
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useState } from "react";
|
2 |
+
import { Typography, Grid, Box, Button } from "@mui/material";
|
3 |
+
import { alpha } from "@mui/material/styles";
|
4 |
+
import LeaderboardCard from "./LeaderboardCard";
|
5 |
+
|
6 |
+
const ITEMS_PER_PAGE = 3;
|
7 |
+
|
8 |
+
const LeaderboardSection = ({ title, leaderboards }) => {
|
9 |
+
const [showAll, setShowAll] = useState(false);
|
10 |
+
|
11 |
+
if (!leaderboards || leaderboards.length === 0) return null;
|
12 |
+
|
13 |
+
const displayedLeaderboards = showAll
|
14 |
+
? leaderboards
|
15 |
+
: leaderboards.slice(0, ITEMS_PER_PAGE);
|
16 |
+
|
17 |
+
return (
|
18 |
+
<Box sx={{ mb: 6 }}>
|
19 |
+
<Box
|
20 |
+
sx={{
|
21 |
+
display: "flex",
|
22 |
+
alignItems: "center",
|
23 |
+
justifyContent: "space-between",
|
24 |
+
mb: 4,
|
25 |
+
}}
|
26 |
+
>
|
27 |
+
<Box sx={{ display: "flex", alignItems: "center", gap: 2 }}>
|
28 |
+
<Typography
|
29 |
+
variant="h4"
|
30 |
+
sx={{
|
31 |
+
color: "text.primary",
|
32 |
+
fontWeight: 600,
|
33 |
+
fontSize: { xs: "1.5rem", md: "2rem" },
|
34 |
+
}}
|
35 |
+
>
|
36 |
+
{title}
|
37 |
+
</Typography>
|
38 |
+
<Box
|
39 |
+
sx={(theme) => ({
|
40 |
+
width: "4px",
|
41 |
+
height: "4px",
|
42 |
+
borderRadius: "100%",
|
43 |
+
backgroundColor: alpha(
|
44 |
+
theme.palette.text.primary,
|
45 |
+
theme.palette.mode === "dark" ? 0.2 : 0.15
|
46 |
+
),
|
47 |
+
})}
|
48 |
+
/>
|
49 |
+
<Typography
|
50 |
+
variant="h4"
|
51 |
+
sx={{
|
52 |
+
color: "text.secondary",
|
53 |
+
fontWeight: 400,
|
54 |
+
fontSize: { xs: "1.25rem", md: "1.5rem" },
|
55 |
+
}}
|
56 |
+
>
|
57 |
+
{leaderboards.length}
|
58 |
+
</Typography>
|
59 |
+
</Box>
|
60 |
+
{leaderboards.length > ITEMS_PER_PAGE && (
|
61 |
+
<Button
|
62 |
+
onClick={() => setShowAll(!showAll)}
|
63 |
+
sx={{
|
64 |
+
color: "text.secondary",
|
65 |
+
fontSize: "0.875rem",
|
66 |
+
textTransform: "none",
|
67 |
+
"&:hover": {
|
68 |
+
backgroundColor: (theme) =>
|
69 |
+
alpha(
|
70 |
+
theme.palette.text.primary,
|
71 |
+
theme.palette.mode === "dark" ? 0.1 : 0.06
|
72 |
+
),
|
73 |
+
},
|
74 |
+
}}
|
75 |
+
>
|
76 |
+
{showAll ? "Show less" : "Show more"}
|
77 |
+
</Button>
|
78 |
+
)}
|
79 |
+
</Box>
|
80 |
+
<Grid container spacing={3}>
|
81 |
+
{displayedLeaderboards.map((leaderboard, index) => (
|
82 |
+
<Grid item xs={12} sm={6} md={4} key={index}>
|
83 |
+
<LeaderboardCard leaderboard={leaderboard} />
|
84 |
+
</Grid>
|
85 |
+
))}
|
86 |
+
</Grid>
|
87 |
+
</Box>
|
88 |
+
);
|
89 |
+
};
|
90 |
+
|
91 |
+
export default LeaderboardSection;
|
client/src/components/Logo/Logo.jsx
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Link } from "react-router-dom";
|
3 |
+
import { Box } from "@mui/material";
|
4 |
+
|
5 |
+
const Logo = () => {
|
6 |
+
return (
|
7 |
+
<Link to="/" style={{ textDecoration: "none" }}>
|
8 |
+
<Box
|
9 |
+
component="img"
|
10 |
+
src="https://huggingface.co/front/assets/huggingface_logo-noborder.svg"
|
11 |
+
alt="Hugging Face"
|
12 |
+
sx={{
|
13 |
+
height: 80,
|
14 |
+
width: "auto",
|
15 |
+
display: "block",
|
16 |
+
margin: "0 auto",
|
17 |
+
}}
|
18 |
+
/>
|
19 |
+
</Link>
|
20 |
+
);
|
21 |
+
};
|
22 |
+
|
23 |
+
export default Logo;
|
client/src/components/Navigation/Navigation.jsx
ADDED
@@ -0,0 +1,317 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useState } from "react";
|
2 |
+
import {
|
3 |
+
AppBar,
|
4 |
+
Toolbar,
|
5 |
+
Box,
|
6 |
+
Link as MuiLink,
|
7 |
+
IconButton,
|
8 |
+
Tooltip,
|
9 |
+
ButtonBase,
|
10 |
+
Typography,
|
11 |
+
Menu,
|
12 |
+
MenuItem,
|
13 |
+
useMediaQuery,
|
14 |
+
useTheme,
|
15 |
+
} from "@mui/material";
|
16 |
+
import { alpha } from "@mui/material/styles";
|
17 |
+
import OpenInNewIcon from "@mui/icons-material/OpenInNew";
|
18 |
+
import LightModeOutlinedIcon from "@mui/icons-material/LightModeOutlined";
|
19 |
+
import DarkModeOutlinedIcon from "@mui/icons-material/DarkModeOutlined";
|
20 |
+
import MenuIcon from "@mui/icons-material/Menu";
|
21 |
+
import { Link, useLocation } from "react-router-dom";
|
22 |
+
|
23 |
+
const Navigation = ({ onToggleTheme, mode }) => {
|
24 |
+
const [anchorEl, setAnchorEl] = useState(null);
|
25 |
+
const theme = useTheme();
|
26 |
+
const isMobile = useMediaQuery(theme.breakpoints.down("md"));
|
27 |
+
const [hasChanged, setHasChanged] = useState(false);
|
28 |
+
const location = useLocation();
|
29 |
+
|
30 |
+
const handleThemeToggle = () => {
|
31 |
+
setHasChanged(true);
|
32 |
+
onToggleTheme();
|
33 |
+
};
|
34 |
+
|
35 |
+
const iconStyle = {
|
36 |
+
fontSize: "1.125rem",
|
37 |
+
...(hasChanged && {
|
38 |
+
animation: "rotateIn 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
|
39 |
+
"@keyframes rotateIn": {
|
40 |
+
"0%": {
|
41 |
+
opacity: 0,
|
42 |
+
transform:
|
43 |
+
mode === "light"
|
44 |
+
? "rotate(-90deg) scale(0.8)"
|
45 |
+
: "rotate(90deg) scale(0.8)",
|
46 |
+
},
|
47 |
+
"100%": {
|
48 |
+
opacity: 1,
|
49 |
+
transform: "rotate(0) scale(1)",
|
50 |
+
},
|
51 |
+
},
|
52 |
+
}),
|
53 |
+
};
|
54 |
+
|
55 |
+
const linkStyle = (isActive = false) => ({
|
56 |
+
textDecoration: "none",
|
57 |
+
color: isActive ? "text.primary" : "text.secondary",
|
58 |
+
fontSize: "0.8125rem",
|
59 |
+
opacity: isActive ? 1 : 0.8,
|
60 |
+
display: "flex",
|
61 |
+
alignItems: "center",
|
62 |
+
gap: 0.5,
|
63 |
+
paddingBottom: "2px",
|
64 |
+
cursor: "pointer",
|
65 |
+
position: "relative",
|
66 |
+
"&:hover": {
|
67 |
+
opacity: 1,
|
68 |
+
color: "text.primary",
|
69 |
+
},
|
70 |
+
"&::after": isActive
|
71 |
+
? {
|
72 |
+
content: '""',
|
73 |
+
position: "absolute",
|
74 |
+
bottom: "-4px",
|
75 |
+
left: "0",
|
76 |
+
width: "100%",
|
77 |
+
height: "2px",
|
78 |
+
backgroundColor: (theme) =>
|
79 |
+
alpha(
|
80 |
+
theme.palette.text.primary,
|
81 |
+
theme.palette.mode === "dark" ? 0.3 : 0.2
|
82 |
+
),
|
83 |
+
borderRadius: "2px",
|
84 |
+
}
|
85 |
+
: {},
|
86 |
+
});
|
87 |
+
|
88 |
+
const Separator = () => (
|
89 |
+
<Box
|
90 |
+
sx={(theme) => ({
|
91 |
+
width: "4px",
|
92 |
+
height: "4px",
|
93 |
+
borderRadius: "100%",
|
94 |
+
backgroundColor: alpha(
|
95 |
+
theme.palette.text.primary,
|
96 |
+
theme.palette.mode === "dark" ? 0.2 : 0.15
|
97 |
+
),
|
98 |
+
})}
|
99 |
+
/>
|
100 |
+
);
|
101 |
+
|
102 |
+
const handleMenuClose = () => {
|
103 |
+
setAnchorEl(null);
|
104 |
+
};
|
105 |
+
|
106 |
+
const handleMenuOpen = (event) => {
|
107 |
+
setAnchorEl(event.currentTarget);
|
108 |
+
};
|
109 |
+
|
110 |
+
return (
|
111 |
+
<AppBar
|
112 |
+
position="static"
|
113 |
+
elevation={0}
|
114 |
+
sx={{
|
115 |
+
backgroundColor: "transparent",
|
116 |
+
}}
|
117 |
+
>
|
118 |
+
<Toolbar sx={{ justifyContent: "center" }}>
|
119 |
+
{isMobile ? (
|
120 |
+
<Box
|
121 |
+
sx={{
|
122 |
+
display: "flex",
|
123 |
+
width: "100%",
|
124 |
+
justifyContent: "space-between",
|
125 |
+
alignItems: "center",
|
126 |
+
}}
|
127 |
+
>
|
128 |
+
<IconButton
|
129 |
+
onClick={handleMenuOpen}
|
130 |
+
sx={{ color: "text.secondary" }}
|
131 |
+
>
|
132 |
+
<MenuIcon />
|
133 |
+
</IconButton>
|
134 |
+
<Menu
|
135 |
+
anchorEl={anchorEl}
|
136 |
+
open={Boolean(anchorEl)}
|
137 |
+
onClose={handleMenuClose}
|
138 |
+
PaperProps={{
|
139 |
+
elevation: 3,
|
140 |
+
sx: {
|
141 |
+
mt: 1.5,
|
142 |
+
minWidth: 220,
|
143 |
+
borderRadius: "12px",
|
144 |
+
border: (theme) =>
|
145 |
+
`1px solid ${alpha(theme.palette.divider, 0.1)}`,
|
146 |
+
backgroundColor: (theme) =>
|
147 |
+
theme.palette.mode === "dark"
|
148 |
+
? alpha(theme.palette.background.paper, 0.8)
|
149 |
+
: theme.palette.background.paper,
|
150 |
+
backdropFilter: "blur(20px)",
|
151 |
+
},
|
152 |
+
}}
|
153 |
+
>
|
154 |
+
<MenuItem
|
155 |
+
component={Link}
|
156 |
+
to="/"
|
157 |
+
onClick={handleMenuClose}
|
158 |
+
selected={location.pathname === "/"}
|
159 |
+
sx={linkStyle(location.pathname === "/")}
|
160 |
+
>
|
161 |
+
Explorer
|
162 |
+
</MenuItem>
|
163 |
+
<MenuItem
|
164 |
+
component={Link}
|
165 |
+
to="/submit"
|
166 |
+
onClick={handleMenuClose}
|
167 |
+
selected={location.pathname === "/submit"}
|
168 |
+
sx={linkStyle(location.pathname === "/submit")}
|
169 |
+
>
|
170 |
+
How to submit?
|
171 |
+
</MenuItem>
|
172 |
+
<MenuItem
|
173 |
+
component={MuiLink}
|
174 |
+
href="https://huggingface.co/docs/leaderboards/open_llm_leaderboard/about"
|
175 |
+
target="_blank"
|
176 |
+
sx={{
|
177 |
+
...linkStyle(),
|
178 |
+
px: 2,
|
179 |
+
py: 1,
|
180 |
+
"& svg": {
|
181 |
+
ml: "auto",
|
182 |
+
fontSize: "0.875rem",
|
183 |
+
opacity: 0.6,
|
184 |
+
},
|
185 |
+
}}
|
186 |
+
>
|
187 |
+
About
|
188 |
+
<OpenInNewIcon />
|
189 |
+
</MenuItem>
|
190 |
+
</Menu>
|
191 |
+
<Tooltip
|
192 |
+
title={
|
193 |
+
mode === "light"
|
194 |
+
? "Switch to dark mode"
|
195 |
+
: "Switch to light mode"
|
196 |
+
}
|
197 |
+
>
|
198 |
+
<ButtonBase
|
199 |
+
onClick={handleThemeToggle}
|
200 |
+
sx={(theme) => ({
|
201 |
+
color: "text.secondary",
|
202 |
+
borderRadius: "100%",
|
203 |
+
padding: 0,
|
204 |
+
width: "36px",
|
205 |
+
height: "36px",
|
206 |
+
display: "flex",
|
207 |
+
alignItems: "center",
|
208 |
+
justifyContent: "center",
|
209 |
+
transition: "all 0.2s ease-in-out",
|
210 |
+
"&:hover": {
|
211 |
+
color: "text.primary",
|
212 |
+
backgroundColor: alpha(
|
213 |
+
theme.palette.text.primary,
|
214 |
+
theme.palette.mode === "dark" ? 0.1 : 0.06
|
215 |
+
),
|
216 |
+
},
|
217 |
+
})}
|
218 |
+
>
|
219 |
+
{mode === "light" ? (
|
220 |
+
<DarkModeOutlinedIcon sx={iconStyle} />
|
221 |
+
) : (
|
222 |
+
<LightModeOutlinedIcon sx={iconStyle} />
|
223 |
+
)}
|
224 |
+
</ButtonBase>
|
225 |
+
</Tooltip>
|
226 |
+
</Box>
|
227 |
+
) : (
|
228 |
+
<Box
|
229 |
+
sx={{
|
230 |
+
display: "flex",
|
231 |
+
gap: 2.5,
|
232 |
+
alignItems: "center",
|
233 |
+
padding: "0.5rem 0",
|
234 |
+
}}
|
235 |
+
>
|
236 |
+
<Box sx={{ display: "flex", gap: 2.5, alignItems: "center" }}>
|
237 |
+
<Link
|
238 |
+
to="/"
|
239 |
+
style={{ textDecoration: "none" }}
|
240 |
+
sx={linkStyle(location.pathname === "/")}
|
241 |
+
>
|
242 |
+
<Box sx={linkStyle(location.pathname === "/")}>Explorer</Box>
|
243 |
+
</Link>
|
244 |
+
<Link
|
245 |
+
to="/submit"
|
246 |
+
style={{ textDecoration: "none" }}
|
247 |
+
sx={linkStyle(location.pathname === "/submit")}
|
248 |
+
>
|
249 |
+
<Box sx={linkStyle(location.pathname === "/submit")}>
|
250 |
+
How to submit?
|
251 |
+
</Box>
|
252 |
+
</Link>
|
253 |
+
<MuiLink
|
254 |
+
href="https://huggingface.co/docs/leaderboards/open_llm_leaderboard/about"
|
255 |
+
target="_blank"
|
256 |
+
rel="noopener noreferrer"
|
257 |
+
sx={{
|
258 |
+
...linkStyle(),
|
259 |
+
"& svg": {
|
260 |
+
fontSize: "0.75rem",
|
261 |
+
ml: 0.5,
|
262 |
+
opacity: 0.6,
|
263 |
+
transition: "opacity 0.2s ease-in-out",
|
264 |
+
},
|
265 |
+
"&:hover svg": {
|
266 |
+
opacity: 0.8,
|
267 |
+
},
|
268 |
+
}}
|
269 |
+
>
|
270 |
+
About
|
271 |
+
<OpenInNewIcon />
|
272 |
+
</MuiLink>
|
273 |
+
</Box>
|
274 |
+
<Separator />
|
275 |
+
<Tooltip
|
276 |
+
title={
|
277 |
+
mode === "light"
|
278 |
+
? "Switch to dark mode"
|
279 |
+
: "Switch to light mode"
|
280 |
+
}
|
281 |
+
>
|
282 |
+
<ButtonBase
|
283 |
+
onClick={handleThemeToggle}
|
284 |
+
sx={(theme) => ({
|
285 |
+
color: "text.secondary",
|
286 |
+
borderRadius: "100%",
|
287 |
+
padding: 0,
|
288 |
+
width: "36px",
|
289 |
+
height: "36px",
|
290 |
+
display: "flex",
|
291 |
+
alignItems: "center",
|
292 |
+
justifyContent: "center",
|
293 |
+
transition: "all 0.2s ease-in-out",
|
294 |
+
"&:hover": {
|
295 |
+
color: "text.primary",
|
296 |
+
backgroundColor: alpha(
|
297 |
+
theme.palette.text.primary,
|
298 |
+
theme.palette.mode === "dark" ? 0.1 : 0.06
|
299 |
+
),
|
300 |
+
},
|
301 |
+
})}
|
302 |
+
>
|
303 |
+
{mode === "light" ? (
|
304 |
+
<DarkModeOutlinedIcon sx={iconStyle} />
|
305 |
+
) : (
|
306 |
+
<LightModeOutlinedIcon sx={iconStyle} />
|
307 |
+
)}
|
308 |
+
</ButtonBase>
|
309 |
+
</Tooltip>
|
310 |
+
</Box>
|
311 |
+
)}
|
312 |
+
</Toolbar>
|
313 |
+
</AppBar>
|
314 |
+
);
|
315 |
+
};
|
316 |
+
|
317 |
+
export default Navigation;
|
client/src/components/PageHeader/PageHeader.jsx
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Box, Typography } from "@mui/material";
|
3 |
+
|
4 |
+
const PageHeader = ({ title, subtitle }) => {
|
5 |
+
return (
|
6 |
+
<Box
|
7 |
+
sx={{
|
8 |
+
display: "flex",
|
9 |
+
flexDirection: "column",
|
10 |
+
alignItems: "center",
|
11 |
+
textAlign: "center",
|
12 |
+
mb: 6,
|
13 |
+
mt: 6,
|
14 |
+
gap: 2,
|
15 |
+
}}
|
16 |
+
>
|
17 |
+
<Typography fontWeight="bold" variant="h3" component="h1">
|
18 |
+
{title}
|
19 |
+
</Typography>
|
20 |
+
{subtitle && (
|
21 |
+
<Typography variant="h6" color="text.secondary">
|
22 |
+
{subtitle}
|
23 |
+
</Typography>
|
24 |
+
)}
|
25 |
+
</Box>
|
26 |
+
);
|
27 |
+
};
|
28 |
+
|
29 |
+
export default PageHeader;
|
client/src/config/api.js
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
|
client/src/config/theme.js
ADDED
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { createTheme, alpha } from "@mui/material/styles";
|
2 |
+
|
3 |
+
const getDesignTokens = (mode) => ({
|
4 |
+
typography: {
|
5 |
+
fontFamily: [
|
6 |
+
"-apple-system",
|
7 |
+
"BlinkMacSystemFont",
|
8 |
+
'"Segoe UI"',
|
9 |
+
"Roboto",
|
10 |
+
'"Helvetica Neue"',
|
11 |
+
"Arial",
|
12 |
+
"sans-serif",
|
13 |
+
].join(","),
|
14 |
+
h1: {
|
15 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
16 |
+
},
|
17 |
+
h2: {
|
18 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
19 |
+
},
|
20 |
+
h3: {
|
21 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
22 |
+
},
|
23 |
+
h4: {
|
24 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
25 |
+
},
|
26 |
+
h5: {
|
27 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
28 |
+
},
|
29 |
+
h6: {
|
30 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
31 |
+
},
|
32 |
+
subtitle1: {
|
33 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
34 |
+
},
|
35 |
+
subtitle2: {
|
36 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
37 |
+
},
|
38 |
+
},
|
39 |
+
palette: {
|
40 |
+
mode,
|
41 |
+
primary: {
|
42 |
+
main: "#4F86C6",
|
43 |
+
light: mode === "light" ? "#7BA7D7" : "#6B97D7",
|
44 |
+
dark: mode === "light" ? "#2B5C94" : "#3B6CA4",
|
45 |
+
50: mode === "light" ? alpha("#4F86C6", 0.05) : alpha("#4F86C6", 0.15),
|
46 |
+
100: mode === "light" ? alpha("#4F86C6", 0.1) : alpha("#4F86C6", 0.2),
|
47 |
+
200: mode === "light" ? alpha("#4F86C6", 0.2) : alpha("#4F86C6", 0.3),
|
48 |
+
contrastText: "#fff",
|
49 |
+
},
|
50 |
+
background: {
|
51 |
+
default: mode === "light" ? "#f8f9fa" : "#0a0a0a",
|
52 |
+
paper: mode === "light" ? "#fff" : "#1a1a1a",
|
53 |
+
subtle: mode === "light" ? "grey.100" : "grey.900",
|
54 |
+
hover: mode === "light" ? "action.hover" : alpha("#fff", 0.08),
|
55 |
+
tooltip: mode === "light" ? alpha("#212121", 0.9) : alpha("#fff", 0.9),
|
56 |
+
},
|
57 |
+
text: {
|
58 |
+
primary: mode === "light" ? "rgba(0, 0, 0, 0.87)" : "#fff",
|
59 |
+
secondary:
|
60 |
+
mode === "light" ? "rgba(0, 0, 0, 0.6)" : "rgba(255, 255, 255, 0.7)",
|
61 |
+
disabled:
|
62 |
+
mode === "light" ? "rgba(0, 0, 0, 0.38)" : "rgba(255, 255, 255, 0.5)",
|
63 |
+
hint:
|
64 |
+
mode === "light" ? "rgba(0, 0, 0, 0.38)" : "rgba(255, 255, 255, 0.5)",
|
65 |
+
},
|
66 |
+
divider:
|
67 |
+
mode === "light" ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)",
|
68 |
+
action: {
|
69 |
+
active:
|
70 |
+
mode === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)",
|
71 |
+
hover:
|
72 |
+
mode === "light" ? "rgba(0, 0, 0, 0.04)" : "rgba(255, 255, 255, 0.08)",
|
73 |
+
selected:
|
74 |
+
mode === "light" ? "rgba(0, 0, 0, 0.08)" : "rgba(255, 255, 255, 0.16)",
|
75 |
+
disabled:
|
76 |
+
mode === "light" ? "rgba(0, 0, 0, 0.26)" : "rgba(255, 255, 255, 0.3)",
|
77 |
+
disabledBackground:
|
78 |
+
mode === "light" ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)",
|
79 |
+
},
|
80 |
+
},
|
81 |
+
shape: {
|
82 |
+
borderRadius: 4,
|
83 |
+
},
|
84 |
+
components: {
|
85 |
+
MuiCssBaseline: {
|
86 |
+
styleOverrides: {
|
87 |
+
"html, body": {
|
88 |
+
backgroundColor: "background.default",
|
89 |
+
color: mode === "dark" ? "#fff" : "#000",
|
90 |
+
},
|
91 |
+
},
|
92 |
+
},
|
93 |
+
|
94 |
+
MuiTableCell: {
|
95 |
+
styleOverrides: {
|
96 |
+
root: {
|
97 |
+
borderColor: (theme) =>
|
98 |
+
alpha(
|
99 |
+
theme.palette.divider,
|
100 |
+
theme.palette.mode === "dark" ? 0.1 : 0.2
|
101 |
+
),
|
102 |
+
},
|
103 |
+
head: {
|
104 |
+
backgroundColor: mode === "light" ? "grey.50" : "grey.900",
|
105 |
+
color: "text.primary",
|
106 |
+
fontWeight: 600,
|
107 |
+
},
|
108 |
+
},
|
109 |
+
},
|
110 |
+
MuiTooltip: {
|
111 |
+
styleOverrides: {
|
112 |
+
tooltip: {
|
113 |
+
backgroundColor:
|
114 |
+
mode === "light" ? alpha("#212121", 0.9) : alpha("#424242", 0.9),
|
115 |
+
color: "#fff",
|
116 |
+
fontSize: "0.875rem",
|
117 |
+
padding: "8px 12px",
|
118 |
+
maxWidth: 400,
|
119 |
+
borderRadius: 8,
|
120 |
+
lineHeight: 1.4,
|
121 |
+
border: "1px solid",
|
122 |
+
borderColor:
|
123 |
+
mode === "light" ? alpha("#fff", 0.1) : alpha("#fff", 0.05),
|
124 |
+
boxShadow:
|
125 |
+
mode === "light"
|
126 |
+
? "0 2px 8px rgba(0, 0, 0, 0.15)"
|
127 |
+
: "0 2px 8px rgba(0, 0, 0, 0.5)",
|
128 |
+
"& b": {
|
129 |
+
fontWeight: 600,
|
130 |
+
color: "inherit",
|
131 |
+
},
|
132 |
+
"& a": {
|
133 |
+
color: mode === "light" ? "#90caf9" : "#64b5f6",
|
134 |
+
textDecoration: "none",
|
135 |
+
"&:hover": {
|
136 |
+
textDecoration: "underline",
|
137 |
+
},
|
138 |
+
},
|
139 |
+
},
|
140 |
+
arrow: {
|
141 |
+
color:
|
142 |
+
mode === "light" ? alpha("#212121", 0.9) : alpha("#424242", 0.9),
|
143 |
+
"&:before": {
|
144 |
+
border: "1px solid",
|
145 |
+
borderColor:
|
146 |
+
mode === "light" ? alpha("#fff", 0.1) : alpha("#fff", 0.05),
|
147 |
+
},
|
148 |
+
},
|
149 |
+
},
|
150 |
+
defaultProps: {
|
151 |
+
arrow: true,
|
152 |
+
enterDelay: 400,
|
153 |
+
leaveDelay: 200,
|
154 |
+
},
|
155 |
+
},
|
156 |
+
MuiAppBar: {
|
157 |
+
styleOverrides: {
|
158 |
+
root: {
|
159 |
+
border: "none",
|
160 |
+
borderBottom: "none",
|
161 |
+
},
|
162 |
+
},
|
163 |
+
},
|
164 |
+
},
|
165 |
+
breakpoints: {
|
166 |
+
values: {
|
167 |
+
xs: 0,
|
168 |
+
sm: 600,
|
169 |
+
md: 900,
|
170 |
+
lg: 1240,
|
171 |
+
xl: 1536,
|
172 |
+
},
|
173 |
+
},
|
174 |
+
});
|
175 |
+
|
176 |
+
const getTheme = (mode) => {
|
177 |
+
const tokens = getDesignTokens(mode);
|
178 |
+
return createTheme(tokens);
|
179 |
+
};
|
180 |
+
|
181 |
+
export default getTheme;
|
client/src/hooks/useThemeMode.js
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useState, useEffect } from "react";
|
2 |
+
|
3 |
+
export const useThemeMode = () => {
|
4 |
+
const [mode, setMode] = useState(() => {
|
5 |
+
const savedMode = localStorage.getItem("theme-mode");
|
6 |
+
return savedMode || "light";
|
7 |
+
});
|
8 |
+
|
9 |
+
useEffect(() => {
|
10 |
+
localStorage.setItem("theme-mode", mode);
|
11 |
+
}, [mode]);
|
12 |
+
|
13 |
+
const toggleTheme = () => {
|
14 |
+
setMode((prevMode) => (prevMode === "light" ? "dark" : "light"));
|
15 |
+
};
|
16 |
+
|
17 |
+
return { mode, toggleTheme };
|
18 |
+
};
|
client/src/index.css
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
:root {
|
2 |
+
font-family: "Source Sans Pro", sans-serif;
|
3 |
+
line-height: 1.5;
|
4 |
+
font-weight: 400;
|
5 |
+
color-scheme: light dark;
|
6 |
+
background-color: #f5f5f5;
|
7 |
+
font-synthesis: none;
|
8 |
+
text-rendering: optimizeLegibility;
|
9 |
+
-webkit-font-smoothing: antialiased;
|
10 |
+
-moz-osx-font-smoothing: grayscale;
|
11 |
+
}
|
12 |
+
|
13 |
+
* {
|
14 |
+
margin: 0;
|
15 |
+
padding: 0;
|
16 |
+
box-sizing: border-box;
|
17 |
+
}
|
18 |
+
|
19 |
+
html,
|
20 |
+
body,
|
21 |
+
#root {
|
22 |
+
width: 100%;
|
23 |
+
min-height: 100vh;
|
24 |
+
font-family: "Source Sans Pro", sans-serif;
|
25 |
+
}
|
26 |
+
|
27 |
+
body {
|
28 |
+
margin: 0;
|
29 |
+
min-width: 320px;
|
30 |
+
}
|
31 |
+
|
32 |
+
@media (prefers-color-scheme: light) {
|
33 |
+
:root {
|
34 |
+
color: #213547;
|
35 |
+
background-color: #f5f5f5;
|
36 |
+
}
|
37 |
+
}
|
client/src/main.jsx
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { StrictMode } from "react";
|
2 |
+
import { createRoot } from "react-dom/client";
|
3 |
+
import { ThemeProvider, createTheme } from "@mui/material/styles";
|
4 |
+
import { CssBaseline } from "@mui/material";
|
5 |
+
import "./index.css";
|
6 |
+
import App from "./App.jsx";
|
7 |
+
|
8 |
+
// Créer un thème personnalisé
|
9 |
+
const theme = createTheme({
|
10 |
+
typography: {
|
11 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
12 |
+
h1: {
|
13 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
14 |
+
},
|
15 |
+
h2: {
|
16 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
17 |
+
},
|
18 |
+
h3: {
|
19 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
20 |
+
},
|
21 |
+
h4: {
|
22 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
23 |
+
},
|
24 |
+
h5: {
|
25 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
26 |
+
},
|
27 |
+
h6: {
|
28 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
29 |
+
},
|
30 |
+
body1: {
|
31 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
32 |
+
},
|
33 |
+
body2: {
|
34 |
+
fontFamily: '"Source Sans Pro", sans-serif',
|
35 |
+
},
|
36 |
+
},
|
37 |
+
});
|
38 |
+
|
39 |
+
createRoot(document.getElementById("root")).render(
|
40 |
+
<StrictMode>
|
41 |
+
<ThemeProvider theme={theme}>
|
42 |
+
<CssBaseline />
|
43 |
+
<App />
|
44 |
+
</ThemeProvider>
|
45 |
+
</StrictMode>
|
46 |
+
);
|
client/src/pages/HowToSubmitPage/HowToSubmitPage.jsx
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import {
|
3 |
+
Box,
|
4 |
+
Typography,
|
5 |
+
Paper,
|
6 |
+
Stack,
|
7 |
+
Divider,
|
8 |
+
alpha,
|
9 |
+
Link,
|
10 |
+
} from "@mui/material";
|
11 |
+
import PageHeader from "../../components/PageHeader/PageHeader";
|
12 |
+
|
13 |
+
const Section = ({ title, children }) => (
|
14 |
+
<Paper
|
15 |
+
elevation={0}
|
16 |
+
sx={{
|
17 |
+
border: "1px solid",
|
18 |
+
borderColor: "grey.300",
|
19 |
+
borderRadius: 1,
|
20 |
+
overflow: "hidden",
|
21 |
+
mb: 3,
|
22 |
+
}}
|
23 |
+
>
|
24 |
+
<Box
|
25 |
+
sx={{
|
26 |
+
px: 3,
|
27 |
+
py: 2,
|
28 |
+
borderBottom: "1px solid",
|
29 |
+
borderColor: (theme) =>
|
30 |
+
theme.palette.mode === "dark"
|
31 |
+
? alpha(theme.palette.divider, 0.1)
|
32 |
+
: "grey.200",
|
33 |
+
bgcolor: (theme) =>
|
34 |
+
theme.palette.mode === "dark"
|
35 |
+
? alpha(theme.palette.background.paper, 0.5)
|
36 |
+
: "grey.50",
|
37 |
+
}}
|
38 |
+
>
|
39 |
+
<Typography variant="h6" sx={{ fontWeight: 600, color: "text.primary" }}>
|
40 |
+
{title}
|
41 |
+
</Typography>
|
42 |
+
</Box>
|
43 |
+
<Box sx={{ p: 3, bgcolor: "background.paper" }}>{children}</Box>
|
44 |
+
</Paper>
|
45 |
+
);
|
46 |
+
|
47 |
+
const Tag = ({ children }) => (
|
48 |
+
<Box
|
49 |
+
component="span"
|
50 |
+
sx={{
|
51 |
+
display: "inline-block",
|
52 |
+
px: 1.5,
|
53 |
+
py: 0.5,
|
54 |
+
bgcolor: (theme) => alpha(theme.palette.primary.main, 0.1),
|
55 |
+
color: "primary.main",
|
56 |
+
borderRadius: 1,
|
57 |
+
fontSize: "0.875rem",
|
58 |
+
fontWeight: 600,
|
59 |
+
mr: 1,
|
60 |
+
mb: 1,
|
61 |
+
}}
|
62 |
+
>
|
63 |
+
{children}
|
64 |
+
</Box>
|
65 |
+
);
|
66 |
+
|
67 |
+
const TagSection = ({ title, description, tags, explanations }) => (
|
68 |
+
<Box sx={{ mb: 4 }}>
|
69 |
+
<Typography variant="h6" sx={{ fontWeight: 600, mb: 1 }}>
|
70 |
+
{title}
|
71 |
+
</Typography>
|
72 |
+
{description && (
|
73 |
+
<Typography variant="body1" sx={{ mb: 2, color: "text.secondary" }}>
|
74 |
+
{description}
|
75 |
+
</Typography>
|
76 |
+
)}
|
77 |
+
<Stack spacing={1}>
|
78 |
+
{tags.map((tag, index) => (
|
79 |
+
<Box key={index}>
|
80 |
+
<Tag>{tag}</Tag>
|
81 |
+
{explanations && explanations[index] && (
|
82 |
+
<Typography
|
83 |
+
component="span"
|
84 |
+
variant="body2"
|
85 |
+
sx={{ color: "text.secondary", ml: 1 }}
|
86 |
+
>
|
87 |
+
{explanations[index]}
|
88 |
+
</Typography>
|
89 |
+
)}
|
90 |
+
</Box>
|
91 |
+
))}
|
92 |
+
</Stack>
|
93 |
+
</Box>
|
94 |
+
);
|
95 |
+
|
96 |
+
const CodeBlock = ({ children }) => (
|
97 |
+
<Box
|
98 |
+
sx={{
|
99 |
+
backgroundColor: (theme) =>
|
100 |
+
theme.palette.mode === "dark"
|
101 |
+
? "rgba(255, 255, 255, 0.05)"
|
102 |
+
: "rgba(0, 0, 0, 0.03)",
|
103 |
+
p: 2,
|
104 |
+
borderRadius: 1,
|
105 |
+
fontFamily: "monospace",
|
106 |
+
mb: 2,
|
107 |
+
}}
|
108 |
+
>
|
109 |
+
{children}
|
110 |
+
</Box>
|
111 |
+
);
|
112 |
+
|
113 |
+
const HowToSubmitPage = () => {
|
114 |
+
return (
|
115 |
+
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
116 |
+
<PageHeader
|
117 |
+
title="How to Submit"
|
118 |
+
subtitle={
|
119 |
+
<>
|
120 |
+
Learn how to <span style={{ fontWeight: 600 }}>be listed</span> on
|
121 |
+
the explorer
|
122 |
+
</>
|
123 |
+
}
|
124 |
+
/>
|
125 |
+
|
126 |
+
<Section title="How to submit your leaderboard?">
|
127 |
+
<Stack spacing={2}>
|
128 |
+
<Typography variant="body1">
|
129 |
+
Your space will appear automatically in the lists if it contains
|
130 |
+
correct metadata!
|
131 |
+
</Typography>
|
132 |
+
<Typography variant="body1">
|
133 |
+
Make sure to either use the tag leaderboard or arena to your space,
|
134 |
+
by adding the following to your README:
|
135 |
+
</Typography>
|
136 |
+
<CodeBlock>
|
137 |
+
tags:
|
138 |
+
<br />
|
139 |
+
- leaderboard
|
140 |
+
</CodeBlock>
|
141 |
+
<Typography variant="body1">
|
142 |
+
then any other tags of interest to you.
|
143 |
+
</Typography>
|
144 |
+
</Stack>
|
145 |
+
</Section>
|
146 |
+
|
147 |
+
<Section title="What do the tags mean?">
|
148 |
+
<TagSection
|
149 |
+
title="Submission type"
|
150 |
+
description="Arenas are not concerned by this category."
|
151 |
+
tags={[
|
152 |
+
"submission:automatic",
|
153 |
+
"submission:semiautomatic",
|
154 |
+
"submission:manual",
|
155 |
+
"submission:closed",
|
156 |
+
]}
|
157 |
+
explanations={[
|
158 |
+
"users can submit their models as such to the leaderboard, and evaluation is run automatically without human intervention",
|
159 |
+
"the leaderboard requires the model owner to run evaluations on his side and submit the results",
|
160 |
+
"the leaderboard requires the leaderboard owner to run evaluations for new submissions",
|
161 |
+
"the leaderboard does not accept submissions at the moment",
|
162 |
+
]}
|
163 |
+
/>
|
164 |
+
|
165 |
+
<Divider sx={{ my: 3 }} />
|
166 |
+
|
167 |
+
<TagSection
|
168 |
+
title="Test set status"
|
169 |
+
description="Arenas are not concerned by this category."
|
170 |
+
tags={["test:public", "test:mix", "test:private", "test:rolling"]}
|
171 |
+
explanations={[
|
172 |
+
"all the test sets used are public, the evaluations are completely reproducible",
|
173 |
+
"some test sets are public and some private",
|
174 |
+
"all the test sets used are private, the evaluations are hard to game",
|
175 |
+
"the test sets used change regularly through time and evaluation scores are refreshed",
|
176 |
+
]}
|
177 |
+
/>
|
178 |
+
|
179 |
+
<Divider sx={{ my: 3 }} />
|
180 |
+
|
181 |
+
<TagSection
|
182 |
+
title="Judges"
|
183 |
+
tags={[
|
184 |
+
"judge:auto",
|
185 |
+
"judge:model",
|
186 |
+
"judge:humans",
|
187 |
+
"judge:vibe_check",
|
188 |
+
]}
|
189 |
+
explanations={[
|
190 |
+
"evaluations are run automatically, using an evaluation suite such as lm_eval or lighteval",
|
191 |
+
"evaluations are run using a model as a judge approach to rate answer",
|
192 |
+
"evaluations are done by humans to rate answer - this is an arena",
|
193 |
+
"evaluations are done manually by one or several humans",
|
194 |
+
]}
|
195 |
+
/>
|
196 |
+
|
197 |
+
<Divider sx={{ my: 3 }} />
|
198 |
+
|
199 |
+
<TagSection
|
200 |
+
title="Modalities"
|
201 |
+
description="Can be any (or several) of the following list:"
|
202 |
+
tags={[
|
203 |
+
"modality:text",
|
204 |
+
"modality:image",
|
205 |
+
"modality:audio",
|
206 |
+
"modality:video",
|
207 |
+
"modality:tools",
|
208 |
+
"modality:artefacts",
|
209 |
+
]}
|
210 |
+
explanations={[
|
211 |
+
"",
|
212 |
+
"",
|
213 |
+
"",
|
214 |
+
"",
|
215 |
+
"requires added tool usage - mostly for assistant models (a bit outside of usual modalities)",
|
216 |
+
"the leaderboard concerns itself with machine learning artefacts as themselves, for example, quality evaluation of text embeddings (a bit outside of usual modalities)",
|
217 |
+
]}
|
218 |
+
/>
|
219 |
+
|
220 |
+
<Divider sx={{ my: 3 }} />
|
221 |
+
|
222 |
+
<TagSection
|
223 |
+
title="Evaluation categories"
|
224 |
+
description="Can be any (or several) of the following list:"
|
225 |
+
tags={[
|
226 |
+
"eval:generation",
|
227 |
+
"eval:math",
|
228 |
+
"eval:code",
|
229 |
+
"eval:performance",
|
230 |
+
"eval:safety",
|
231 |
+
]}
|
232 |
+
explanations={[
|
233 |
+
"the evaluation looks at generation capabilities specifically (can be image generation, text generation, ...)",
|
234 |
+
"the evaluation tests math abilities",
|
235 |
+
"the evaluation tests coding capabilities",
|
236 |
+
"model performance (speed, energy consumption, ...)",
|
237 |
+
"the evaluation considers safety, toxicity, bias",
|
238 |
+
]}
|
239 |
+
/>
|
240 |
+
|
241 |
+
<Divider sx={{ my: 3 }} />
|
242 |
+
|
243 |
+
<TagSection
|
244 |
+
title="Language"
|
245 |
+
description="You can indicate the languages covered by your benchmark like so: language:mylanguage. At the moment, we do not support language codes, please use the language name in English."
|
246 |
+
tags={["language:english", "language:french"]}
|
247 |
+
/>
|
248 |
+
|
249 |
+
<Divider sx={{ my: 3 }} />
|
250 |
+
|
251 |
+
<TagSection
|
252 |
+
title="Domain"
|
253 |
+
description="Indicates the specific domain of the leaderboard:"
|
254 |
+
tags={["domain:financial", "domain:medical", "domain:legal"]}
|
255 |
+
/>
|
256 |
+
<Typography
|
257 |
+
variant="body2"
|
258 |
+
sx={{
|
259 |
+
mt: 1,
|
260 |
+
color: "text.secondary",
|
261 |
+
fontSize: "0.875rem",
|
262 |
+
fontStyle: "italic",
|
263 |
+
}}
|
264 |
+
>
|
265 |
+
If you would like to see a domain that is not currently represented,
|
266 |
+
please contact{" "}
|
267 |
+
<Link
|
268 |
+
href="https://huggingface.co/clementine"
|
269 |
+
target="_blank"
|
270 |
+
rel="noopener noreferrer"
|
271 |
+
sx={{
|
272 |
+
color: "primary.main",
|
273 |
+
textDecoration: "none",
|
274 |
+
"&:hover": {
|
275 |
+
textDecoration: "underline",
|
276 |
+
},
|
277 |
+
}}
|
278 |
+
>
|
279 |
+
Clementine Fourrier
|
280 |
+
</Link>{" "}
|
281 |
+
on Hugging Face.
|
282 |
+
</Typography>
|
283 |
+
|
284 |
+
<Divider sx={{ my: 3 }} />
|
285 |
+
</Section>
|
286 |
+
</Box>
|
287 |
+
);
|
288 |
+
};
|
289 |
+
|
290 |
+
export default HowToSubmitPage;
|
client/src/pages/LeaderboardPage/LeaderboardPage.jsx
ADDED
@@ -0,0 +1,224 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useState, useEffect } from "react";
|
2 |
+
import {
|
3 |
+
Box,
|
4 |
+
CircularProgress,
|
5 |
+
Stack,
|
6 |
+
Button,
|
7 |
+
FormControlLabel,
|
8 |
+
Switch,
|
9 |
+
} from "@mui/material";
|
10 |
+
import Logo from "../../components/Logo/Logo";
|
11 |
+
import PageHeader from "../../components/PageHeader/PageHeader";
|
12 |
+
import LeaderboardSection from "../../components/LeaderboardSection";
|
13 |
+
import { alpha } from "@mui/material/styles";
|
14 |
+
|
15 |
+
const LeaderboardPage = () => {
|
16 |
+
const [leaderboards, setLeaderboards] = useState(null);
|
17 |
+
const [loading, setLoading] = useState(true);
|
18 |
+
const [arenaOnly, setArenaOnly] = useState(false);
|
19 |
+
|
20 |
+
useEffect(() => {
|
21 |
+
fetch("http://localhost:3002/api/leaderboards")
|
22 |
+
.then((res) => res.json())
|
23 |
+
.then((data) => {
|
24 |
+
const leaderboardsArray = Array.isArray(data)
|
25 |
+
? data
|
26 |
+
: Object.values(data).filter((item) => Array.isArray(item))[0];
|
27 |
+
setLeaderboards(leaderboardsArray);
|
28 |
+
setLoading(false);
|
29 |
+
})
|
30 |
+
.catch((error) => {
|
31 |
+
console.error("Error fetching leaderboards:", error);
|
32 |
+
setLoading(false);
|
33 |
+
});
|
34 |
+
}, []);
|
35 |
+
|
36 |
+
if (!leaderboards && !loading) {
|
37 |
+
return null;
|
38 |
+
}
|
39 |
+
|
40 |
+
const filterByTag = (tag) => {
|
41 |
+
let filtered =
|
42 |
+
leaderboards?.filter((leaderboard) =>
|
43 |
+
leaderboard.consolidated_tags?.includes(tag)
|
44 |
+
) || [];
|
45 |
+
|
46 |
+
if (arenaOnly) {
|
47 |
+
filtered = filtered.filter((leaderboard) =>
|
48 |
+
leaderboard.consolidated_tags?.includes("judge:humans")
|
49 |
+
);
|
50 |
+
}
|
51 |
+
|
52 |
+
return filtered.sort((a, b) => (b.likes || 0) - (a.likes || 0));
|
53 |
+
};
|
54 |
+
|
55 |
+
const filterByLanguage = () => {
|
56 |
+
let filtered =
|
57 |
+
leaderboards?.filter((leaderboard) =>
|
58 |
+
leaderboard.consolidated_tags?.some((tag) =>
|
59 |
+
tag.startsWith("language:")
|
60 |
+
)
|
61 |
+
) || [];
|
62 |
+
|
63 |
+
if (arenaOnly) {
|
64 |
+
filtered = filtered.filter((leaderboard) =>
|
65 |
+
leaderboard.consolidated_tags?.includes("judge:humans")
|
66 |
+
);
|
67 |
+
}
|
68 |
+
|
69 |
+
return filtered.sort((a, b) => (b.likes || 0) - (a.likes || 0));
|
70 |
+
};
|
71 |
+
|
72 |
+
const codeLeaderboards = filterByTag("eval:code");
|
73 |
+
const mathLeaderboards = filterByTag("eval:math");
|
74 |
+
const languageLeaderboards = filterByLanguage();
|
75 |
+
const videoLeaderboards = filterByTag("modality:video");
|
76 |
+
const audioLeaderboards = filterByTag("modality:audio");
|
77 |
+
const agenticLeaderboards = filterByTag("modality:tools");
|
78 |
+
const financialLeaderboards = filterByTag("domain:financial");
|
79 |
+
const medicalLeaderboards = filterByTag("domain:medical");
|
80 |
+
const legalLeaderboards = filterByTag("domain:legal");
|
81 |
+
|
82 |
+
const allSections = [
|
83 |
+
{ id: "code", title: "Code", data: codeLeaderboards },
|
84 |
+
{ id: "math", title: "Math", data: mathLeaderboards },
|
85 |
+
{ id: "language", title: "Language Specific", data: languageLeaderboards },
|
86 |
+
{ id: "video", title: "Vision language model", data: videoLeaderboards },
|
87 |
+
{ id: "audio", title: "Audio", data: audioLeaderboards },
|
88 |
+
{ id: "agentic", title: "Agentic", data: agenticLeaderboards },
|
89 |
+
{ id: "financial", title: "Financial", data: financialLeaderboards },
|
90 |
+
{ id: "medical", title: "Medical", data: medicalLeaderboards },
|
91 |
+
{ id: "legal", title: "Legal", data: legalLeaderboards },
|
92 |
+
];
|
93 |
+
|
94 |
+
const sections = allSections.filter((section) => section.data.length > 0);
|
95 |
+
|
96 |
+
return (
|
97 |
+
<Box
|
98 |
+
sx={{
|
99 |
+
width: "100%",
|
100 |
+
ph: 2,
|
101 |
+
display: "flex",
|
102 |
+
flexDirection: "column",
|
103 |
+
}}
|
104 |
+
>
|
105 |
+
<Box
|
106 |
+
sx={{ display: "flex", justifyContent: "center", pt: 6, mb: -4, pb: 0 }}
|
107 |
+
>
|
108 |
+
<Logo />
|
109 |
+
</Box>
|
110 |
+
<PageHeader
|
111 |
+
title="Leaderboards on the Hub"
|
112 |
+
subtitle={
|
113 |
+
<>
|
114 |
+
<span style={{ fontWeight: 600 }}>Discover</span> and{" "}
|
115 |
+
<span style={{ fontWeight: 600 }}>explore</span> all leaderboards
|
116 |
+
from the{" "}
|
117 |
+
<span style={{ fontWeight: 600 }}>Hugging Face community</span>
|
118 |
+
</>
|
119 |
+
}
|
120 |
+
/>
|
121 |
+
|
122 |
+
{loading ? (
|
123 |
+
<Box sx={{ display: "flex", justifyContent: "center", mt: 4 }}>
|
124 |
+
<CircularProgress />
|
125 |
+
</Box>
|
126 |
+
) : (
|
127 |
+
<Box
|
128 |
+
sx={{
|
129 |
+
width: "100%",
|
130 |
+
maxWidth: "1200px",
|
131 |
+
mx: "auto",
|
132 |
+
mt: 4,
|
133 |
+
}}
|
134 |
+
>
|
135 |
+
{/* Table of Contents with Arena Toggle */}
|
136 |
+
<Box sx={{ display: "flex", alignItems: "center", mb: 4 }}>
|
137 |
+
<Stack
|
138 |
+
direction="row"
|
139 |
+
spacing={1}
|
140 |
+
sx={{
|
141 |
+
flexWrap: "wrap",
|
142 |
+
gap: 1,
|
143 |
+
flex: 1,
|
144 |
+
}}
|
145 |
+
>
|
146 |
+
{allSections.map(({ id, title, data }) => (
|
147 |
+
<Button
|
148 |
+
key={id}
|
149 |
+
onClick={() => {
|
150 |
+
if (data.length > 0) {
|
151 |
+
document.getElementById(id)?.scrollIntoView({
|
152 |
+
behavior: "smooth",
|
153 |
+
block: "start",
|
154 |
+
});
|
155 |
+
}
|
156 |
+
}}
|
157 |
+
variant="text"
|
158 |
+
size="small"
|
159 |
+
disabled={data.length === 0}
|
160 |
+
sx={{
|
161 |
+
color:
|
162 |
+
data.length === 0 ? "text.disabled" : "text.secondary",
|
163 |
+
textTransform: "none",
|
164 |
+
fontSize: "0.875rem",
|
165 |
+
opacity: data.length === 0 ? 0.5 : 1,
|
166 |
+
cursor: data.length === 0 ? "default" : "pointer",
|
167 |
+
display: "flex",
|
168 |
+
alignItems: "center",
|
169 |
+
gap: 1,
|
170 |
+
"&:hover": {
|
171 |
+
backgroundColor:
|
172 |
+
data.length === 0
|
173 |
+
? "transparent"
|
174 |
+
: (theme) =>
|
175 |
+
alpha(
|
176 |
+
theme.palette.text.primary,
|
177 |
+
theme.palette.mode === "dark" ? 0.1 : 0.06
|
178 |
+
),
|
179 |
+
},
|
180 |
+
}}
|
181 |
+
>
|
182 |
+
{title}
|
183 |
+
<Box
|
184 |
+
sx={(theme) => ({
|
185 |
+
width: "3px",
|
186 |
+
height: "3px",
|
187 |
+
borderRadius: "100%",
|
188 |
+
backgroundColor: alpha(
|
189 |
+
theme.palette.text.primary,
|
190 |
+
theme.palette.mode === "dark" ? 0.2 : 0.15
|
191 |
+
),
|
192 |
+
opacity: data.length === 0 ? 0.5 : 1,
|
193 |
+
})}
|
194 |
+
/>
|
195 |
+
{data.length}
|
196 |
+
</Button>
|
197 |
+
))}
|
198 |
+
</Stack>
|
199 |
+
<FormControlLabel
|
200 |
+
control={
|
201 |
+
<Switch
|
202 |
+
checked={arenaOnly}
|
203 |
+
onChange={(e) => setArenaOnly(e.target.checked)}
|
204 |
+
size="small"
|
205 |
+
/>
|
206 |
+
}
|
207 |
+
label="Arena only"
|
208 |
+
sx={{ ml: 2 }}
|
209 |
+
/>
|
210 |
+
</Box>
|
211 |
+
|
212 |
+
{/* Sections */}
|
213 |
+
{sections.map(({ id, title, data }) => (
|
214 |
+
<Box key={id} id={id}>
|
215 |
+
<LeaderboardSection title={title} leaderboards={data} />
|
216 |
+
</Box>
|
217 |
+
))}
|
218 |
+
</Box>
|
219 |
+
)}
|
220 |
+
</Box>
|
221 |
+
);
|
222 |
+
};
|
223 |
+
|
224 |
+
export default LeaderboardPage;
|
client/vite.config.js
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { defineConfig } from 'vite'
|
2 |
+
import react from '@vitejs/plugin-react'
|
3 |
+
|
4 |
+
// https://vite.dev/config/
|
5 |
+
export default defineConfig({
|
6 |
+
plugins: [react()],
|
7 |
+
})
|
client/yarn.lock
ADDED
The diff for this file is too large to render.
See raw diff
|
|
server/.env.example
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Hugging Face Hub token (required)
|
2 |
+
# Create one at https://huggingface.co/settings/tokens
|
3 |
+
HUGGING_FACE_HUB_TOKEN=your_token_here
|
4 |
+
|
5 |
+
# Repository ID for storing leaderboard data (required)
|
6 |
+
# Format: username/repo-name
|
7 |
+
HF_STORAGE_REPO=username/leaderboard-data
|
8 |
+
|
9 |
+
# API Configuration (optional)
|
10 |
+
API_HOST=0.0.0.0
|
11 |
+
API_PORT=3002
|
12 |
+
|
13 |
+
# Update interval in minutes (optional, default: 30)
|
14 |
+
UPDATE_INTERVAL_MINUTES=30
|
server/__pycache__/main.cpython-310.pyc
ADDED
Binary file (2.52 kB). View file
|
|
server/__pycache__/server.cpython-310.pyc
ADDED
Binary file (2.53 kB). View file
|
|
server/main.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# HF API configuration
|
2 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
3 |
+
REPO_ID = "tfrere/leaderboard-explorer"
|
4 |
+
FILE_PATH = "final_leaderboards.json" # Changed from leaderboards.json
|
5 |
+
CACHE_DURATION_MINUTES = int(os.getenv("UPDATE_INTERVAL_MINUTES", "15")) # Get from env or default to 15
|
server/poetry.lock
ADDED
@@ -0,0 +1,929 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
|
2 |
+
|
3 |
+
[[package]]
|
4 |
+
name = "annotated-types"
|
5 |
+
version = "0.7.0"
|
6 |
+
description = "Reusable constraint types to use with typing.Annotated"
|
7 |
+
optional = false
|
8 |
+
python-versions = ">=3.8"
|
9 |
+
files = [
|
10 |
+
{file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
|
11 |
+
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
|
12 |
+
]
|
13 |
+
|
14 |
+
[[package]]
|
15 |
+
name = "anyio"
|
16 |
+
version = "4.8.0"
|
17 |
+
description = "High level compatibility layer for multiple asynchronous event loop implementations"
|
18 |
+
optional = false
|
19 |
+
python-versions = ">=3.9"
|
20 |
+
files = [
|
21 |
+
{file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
|
22 |
+
{file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
|
23 |
+
]
|
24 |
+
|
25 |
+
[package.dependencies]
|
26 |
+
exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
|
27 |
+
idna = ">=2.8"
|
28 |
+
sniffio = ">=1.1"
|
29 |
+
typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
|
30 |
+
|
31 |
+
[package.extras]
|
32 |
+
doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
|
33 |
+
test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"]
|
34 |
+
trio = ["trio (>=0.26.1)"]
|
35 |
+
|
36 |
+
[[package]]
|
37 |
+
name = "apscheduler"
|
38 |
+
version = "3.11.0"
|
39 |
+
description = "In-process task scheduler with Cron-like capabilities"
|
40 |
+
optional = false
|
41 |
+
python-versions = ">=3.8"
|
42 |
+
files = [
|
43 |
+
{file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"},
|
44 |
+
{file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"},
|
45 |
+
]
|
46 |
+
|
47 |
+
[package.dependencies]
|
48 |
+
tzlocal = ">=3.0"
|
49 |
+
|
50 |
+
[package.extras]
|
51 |
+
doc = ["packaging", "sphinx", "sphinx-rtd-theme (>=1.3.0)"]
|
52 |
+
etcd = ["etcd3", "protobuf (<=3.21.0)"]
|
53 |
+
gevent = ["gevent"]
|
54 |
+
mongodb = ["pymongo (>=3.0)"]
|
55 |
+
redis = ["redis (>=3.0)"]
|
56 |
+
rethinkdb = ["rethinkdb (>=2.4.0)"]
|
57 |
+
sqlalchemy = ["sqlalchemy (>=1.4)"]
|
58 |
+
test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6", "anyio (>=4.5.2)", "gevent", "pytest", "pytz", "twisted"]
|
59 |
+
tornado = ["tornado (>=4.3)"]
|
60 |
+
twisted = ["twisted"]
|
61 |
+
zookeeper = ["kazoo"]
|
62 |
+
|
63 |
+
[[package]]
|
64 |
+
name = "certifi"
|
65 |
+
version = "2024.12.14"
|
66 |
+
description = "Python package for providing Mozilla's CA Bundle."
|
67 |
+
optional = false
|
68 |
+
python-versions = ">=3.6"
|
69 |
+
files = [
|
70 |
+
{file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
|
71 |
+
{file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
|
72 |
+
]
|
73 |
+
|
74 |
+
[[package]]
|
75 |
+
name = "cffi"
|
76 |
+
version = "1.17.1"
|
77 |
+
description = "Foreign Function Interface for Python calling C code."
|
78 |
+
optional = false
|
79 |
+
python-versions = ">=3.8"
|
80 |
+
files = [
|
81 |
+
{file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
|
82 |
+
{file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
|
83 |
+
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"},
|
84 |
+
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"},
|
85 |
+
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"},
|
86 |
+
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"},
|
87 |
+
{file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"},
|
88 |
+
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"},
|
89 |
+
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"},
|
90 |
+
{file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"},
|
91 |
+
{file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"},
|
92 |
+
{file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"},
|
93 |
+
{file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"},
|
94 |
+
{file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"},
|
95 |
+
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"},
|
96 |
+
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"},
|
97 |
+
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"},
|
98 |
+
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"},
|
99 |
+
{file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"},
|
100 |
+
{file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"},
|
101 |
+
{file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"},
|
102 |
+
{file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"},
|
103 |
+
{file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"},
|
104 |
+
{file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"},
|
105 |
+
{file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"},
|
106 |
+
{file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"},
|
107 |
+
{file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"},
|
108 |
+
{file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"},
|
109 |
+
{file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"},
|
110 |
+
{file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"},
|
111 |
+
{file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"},
|
112 |
+
{file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"},
|
113 |
+
{file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"},
|
114 |
+
{file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"},
|
115 |
+
{file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"},
|
116 |
+
{file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"},
|
117 |
+
{file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"},
|
118 |
+
{file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"},
|
119 |
+
{file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"},
|
120 |
+
{file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"},
|
121 |
+
{file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"},
|
122 |
+
{file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"},
|
123 |
+
{file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"},
|
124 |
+
{file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"},
|
125 |
+
{file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"},
|
126 |
+
{file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"},
|
127 |
+
{file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"},
|
128 |
+
{file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"},
|
129 |
+
{file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"},
|
130 |
+
{file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"},
|
131 |
+
{file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"},
|
132 |
+
{file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"},
|
133 |
+
{file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"},
|
134 |
+
{file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"},
|
135 |
+
{file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"},
|
136 |
+
{file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"},
|
137 |
+
{file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"},
|
138 |
+
{file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"},
|
139 |
+
{file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"},
|
140 |
+
{file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"},
|
141 |
+
{file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"},
|
142 |
+
{file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"},
|
143 |
+
{file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"},
|
144 |
+
{file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"},
|
145 |
+
{file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"},
|
146 |
+
{file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"},
|
147 |
+
{file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"},
|
148 |
+
]
|
149 |
+
|
150 |
+
[package.dependencies]
|
151 |
+
pycparser = "*"
|
152 |
+
|
153 |
+
[[package]]
|
154 |
+
name = "charset-normalizer"
|
155 |
+
version = "3.4.1"
|
156 |
+
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
157 |
+
optional = false
|
158 |
+
python-versions = ">=3.7"
|
159 |
+
files = [
|
160 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
|
161 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
|
162 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
|
163 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
|
164 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
|
165 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
|
166 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
|
167 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
|
168 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
|
169 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
|
170 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
|
171 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
|
172 |
+
{file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
|
173 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
|
174 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
|
175 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
|
176 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
|
177 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
|
178 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
|
179 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
|
180 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
|
181 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
|
182 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
|
183 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
|
184 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
|
185 |
+
{file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
|
186 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
|
187 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
|
188 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
|
189 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
|
190 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
|
191 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
|
192 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
|
193 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
|
194 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
|
195 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
|
196 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
|
197 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
|
198 |
+
{file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
|
199 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
|
200 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
|
201 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
|
202 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
|
203 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
|
204 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
|
205 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
|
206 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
|
207 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
|
208 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
|
209 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
|
210 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
|
211 |
+
{file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
|
212 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
|
213 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
|
214 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
|
215 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
|
216 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
|
217 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
|
218 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
|
219 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
|
220 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
|
221 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
|
222 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
|
223 |
+
{file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
|
224 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
|
225 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
|
226 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
|
227 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
|
228 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
|
229 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
|
230 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
|
231 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
|
232 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
|
233 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
|
234 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
|
235 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
|
236 |
+
{file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
|
237 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
|
238 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
|
239 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
|
240 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
|
241 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
|
242 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
|
243 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
|
244 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
|
245 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
|
246 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
|
247 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
|
248 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
|
249 |
+
{file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
|
250 |
+
{file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
|
251 |
+
{file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
|
252 |
+
]
|
253 |
+
|
254 |
+
[[package]]
|
255 |
+
name = "click"
|
256 |
+
version = "8.1.8"
|
257 |
+
description = "Composable command line interface toolkit"
|
258 |
+
optional = false
|
259 |
+
python-versions = ">=3.7"
|
260 |
+
files = [
|
261 |
+
{file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
|
262 |
+
{file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
|
263 |
+
]
|
264 |
+
|
265 |
+
[package.dependencies]
|
266 |
+
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
267 |
+
|
268 |
+
[[package]]
|
269 |
+
name = "colorama"
|
270 |
+
version = "0.4.6"
|
271 |
+
description = "Cross-platform colored terminal text."
|
272 |
+
optional = false
|
273 |
+
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
|
274 |
+
files = [
|
275 |
+
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
|
276 |
+
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
277 |
+
]
|
278 |
+
|
279 |
+
[[package]]
|
280 |
+
name = "cryptography"
|
281 |
+
version = "43.0.3"
|
282 |
+
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
|
283 |
+
optional = false
|
284 |
+
python-versions = ">=3.7"
|
285 |
+
files = [
|
286 |
+
{file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"},
|
287 |
+
{file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"},
|
288 |
+
{file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"},
|
289 |
+
{file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"},
|
290 |
+
{file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"},
|
291 |
+
{file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"},
|
292 |
+
{file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"},
|
293 |
+
{file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"},
|
294 |
+
{file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"},
|
295 |
+
{file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"},
|
296 |
+
{file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"},
|
297 |
+
{file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"},
|
298 |
+
{file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"},
|
299 |
+
{file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"},
|
300 |
+
{file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"},
|
301 |
+
{file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"},
|
302 |
+
{file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"},
|
303 |
+
{file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"},
|
304 |
+
{file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"},
|
305 |
+
{file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"},
|
306 |
+
{file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"},
|
307 |
+
{file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"},
|
308 |
+
{file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"},
|
309 |
+
{file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"},
|
310 |
+
{file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"},
|
311 |
+
{file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"},
|
312 |
+
{file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"},
|
313 |
+
]
|
314 |
+
|
315 |
+
[package.dependencies]
|
316 |
+
cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
|
317 |
+
|
318 |
+
[package.extras]
|
319 |
+
docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"]
|
320 |
+
docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"]
|
321 |
+
nox = ["nox"]
|
322 |
+
pep8test = ["check-sdist", "click", "mypy", "ruff"]
|
323 |
+
sdist = ["build"]
|
324 |
+
ssh = ["bcrypt (>=3.1.5)"]
|
325 |
+
test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
|
326 |
+
test-randomorder = ["pytest-randomly"]
|
327 |
+
|
328 |
+
[[package]]
|
329 |
+
name = "ecdsa"
|
330 |
+
version = "0.19.0"
|
331 |
+
description = "ECDSA cryptographic signature library (pure python)"
|
332 |
+
optional = false
|
333 |
+
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6"
|
334 |
+
files = [
|
335 |
+
{file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"},
|
336 |
+
{file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"},
|
337 |
+
]
|
338 |
+
|
339 |
+
[package.dependencies]
|
340 |
+
six = ">=1.9.0"
|
341 |
+
|
342 |
+
[package.extras]
|
343 |
+
gmpy = ["gmpy"]
|
344 |
+
gmpy2 = ["gmpy2"]
|
345 |
+
|
346 |
+
[[package]]
|
347 |
+
name = "exceptiongroup"
|
348 |
+
version = "1.2.2"
|
349 |
+
description = "Backport of PEP 654 (exception groups)"
|
350 |
+
optional = false
|
351 |
+
python-versions = ">=3.7"
|
352 |
+
files = [
|
353 |
+
{file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
|
354 |
+
{file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
|
355 |
+
]
|
356 |
+
|
357 |
+
[package.extras]
|
358 |
+
test = ["pytest (>=6)"]
|
359 |
+
|
360 |
+
[[package]]
|
361 |
+
name = "fastapi"
|
362 |
+
version = "0.109.2"
|
363 |
+
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
364 |
+
optional = false
|
365 |
+
python-versions = ">=3.8"
|
366 |
+
files = [
|
367 |
+
{file = "fastapi-0.109.2-py3-none-any.whl", hash = "sha256:2c9bab24667293b501cad8dd388c05240c850b58ec5876ee3283c47d6e1e3a4d"},
|
368 |
+
{file = "fastapi-0.109.2.tar.gz", hash = "sha256:f3817eac96fe4f65a2ebb4baa000f394e55f5fccdaf7f75250804bc58f354f73"},
|
369 |
+
]
|
370 |
+
|
371 |
+
[package.dependencies]
|
372 |
+
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
|
373 |
+
starlette = ">=0.36.3,<0.37.0"
|
374 |
+
typing-extensions = ">=4.8.0"
|
375 |
+
|
376 |
+
[package.extras]
|
377 |
+
all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
|
378 |
+
|
379 |
+
[[package]]
|
380 |
+
name = "filelock"
|
381 |
+
version = "3.16.1"
|
382 |
+
description = "A platform independent file lock."
|
383 |
+
optional = false
|
384 |
+
python-versions = ">=3.8"
|
385 |
+
files = [
|
386 |
+
{file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"},
|
387 |
+
{file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"},
|
388 |
+
]
|
389 |
+
|
390 |
+
[package.extras]
|
391 |
+
docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"]
|
392 |
+
testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"]
|
393 |
+
typing = ["typing-extensions (>=4.12.2)"]
|
394 |
+
|
395 |
+
[[package]]
|
396 |
+
name = "fsspec"
|
397 |
+
version = "2024.12.0"
|
398 |
+
description = "File-system specification"
|
399 |
+
optional = false
|
400 |
+
python-versions = ">=3.8"
|
401 |
+
files = [
|
402 |
+
{file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"},
|
403 |
+
{file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"},
|
404 |
+
]
|
405 |
+
|
406 |
+
[package.extras]
|
407 |
+
abfs = ["adlfs"]
|
408 |
+
adl = ["adlfs"]
|
409 |
+
arrow = ["pyarrow (>=1)"]
|
410 |
+
dask = ["dask", "distributed"]
|
411 |
+
dev = ["pre-commit", "ruff"]
|
412 |
+
doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"]
|
413 |
+
dropbox = ["dropbox", "dropboxdrivefs", "requests"]
|
414 |
+
full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"]
|
415 |
+
fuse = ["fusepy"]
|
416 |
+
gcs = ["gcsfs"]
|
417 |
+
git = ["pygit2"]
|
418 |
+
github = ["requests"]
|
419 |
+
gs = ["gcsfs"]
|
420 |
+
gui = ["panel"]
|
421 |
+
hdfs = ["pyarrow (>=1)"]
|
422 |
+
http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"]
|
423 |
+
libarchive = ["libarchive-c"]
|
424 |
+
oci = ["ocifs"]
|
425 |
+
s3 = ["s3fs"]
|
426 |
+
sftp = ["paramiko"]
|
427 |
+
smb = ["smbprotocol"]
|
428 |
+
ssh = ["paramiko"]
|
429 |
+
test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"]
|
430 |
+
test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"]
|
431 |
+
test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"]
|
432 |
+
tqdm = ["tqdm"]
|
433 |
+
|
434 |
+
[[package]]
|
435 |
+
name = "h11"
|
436 |
+
version = "0.14.0"
|
437 |
+
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
|
438 |
+
optional = false
|
439 |
+
python-versions = ">=3.7"
|
440 |
+
files = [
|
441 |
+
{file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
|
442 |
+
{file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
|
443 |
+
]
|
444 |
+
|
445 |
+
[[package]]
|
446 |
+
name = "huggingface-hub"
|
447 |
+
version = "0.21.4"
|
448 |
+
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
|
449 |
+
optional = false
|
450 |
+
python-versions = ">=3.8.0"
|
451 |
+
files = [
|
452 |
+
{file = "huggingface_hub-0.21.4-py3-none-any.whl", hash = "sha256:df37c2c37fc6c82163cdd8a67ede261687d80d1e262526d6c0ce73b6b3630a7b"},
|
453 |
+
{file = "huggingface_hub-0.21.4.tar.gz", hash = "sha256:e1f4968c93726565a80edf6dc309763c7b546d0cfe79aa221206034d50155531"},
|
454 |
+
]
|
455 |
+
|
456 |
+
[package.dependencies]
|
457 |
+
filelock = "*"
|
458 |
+
fsspec = ">=2023.5.0"
|
459 |
+
packaging = ">=20.9"
|
460 |
+
pyyaml = ">=5.1"
|
461 |
+
requests = "*"
|
462 |
+
tqdm = ">=4.42.1"
|
463 |
+
typing-extensions = ">=3.7.4.3"
|
464 |
+
|
465 |
+
[package.extras]
|
466 |
+
all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
|
467 |
+
cli = ["InquirerPy (==0.3.4)"]
|
468 |
+
dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
|
469 |
+
fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
|
470 |
+
hf-transfer = ["hf-transfer (>=0.1.4)"]
|
471 |
+
inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"]
|
472 |
+
quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"]
|
473 |
+
tensorflow = ["graphviz", "pydot", "tensorflow"]
|
474 |
+
testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
|
475 |
+
torch = ["safetensors", "torch"]
|
476 |
+
typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
|
477 |
+
|
478 |
+
[[package]]
|
479 |
+
name = "idna"
|
480 |
+
version = "3.10"
|
481 |
+
description = "Internationalized Domain Names in Applications (IDNA)"
|
482 |
+
optional = false
|
483 |
+
python-versions = ">=3.6"
|
484 |
+
files = [
|
485 |
+
{file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
|
486 |
+
{file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
|
487 |
+
]
|
488 |
+
|
489 |
+
[package.extras]
|
490 |
+
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
|
491 |
+
|
492 |
+
[[package]]
|
493 |
+
name = "packaging"
|
494 |
+
version = "24.2"
|
495 |
+
description = "Core utilities for Python packages"
|
496 |
+
optional = false
|
497 |
+
python-versions = ">=3.8"
|
498 |
+
files = [
|
499 |
+
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
|
500 |
+
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
|
501 |
+
]
|
502 |
+
|
503 |
+
[[package]]
|
504 |
+
name = "pyasn1"
|
505 |
+
version = "0.6.1"
|
506 |
+
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
|
507 |
+
optional = false
|
508 |
+
python-versions = ">=3.8"
|
509 |
+
files = [
|
510 |
+
{file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
|
511 |
+
{file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
|
512 |
+
]
|
513 |
+
|
514 |
+
[[package]]
|
515 |
+
name = "pycparser"
|
516 |
+
version = "2.22"
|
517 |
+
description = "C parser in Python"
|
518 |
+
optional = false
|
519 |
+
python-versions = ">=3.8"
|
520 |
+
files = [
|
521 |
+
{file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
|
522 |
+
{file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
|
523 |
+
]
|
524 |
+
|
525 |
+
[[package]]
|
526 |
+
name = "pydantic"
|
527 |
+
version = "2.10.5"
|
528 |
+
description = "Data validation using Python type hints"
|
529 |
+
optional = false
|
530 |
+
python-versions = ">=3.8"
|
531 |
+
files = [
|
532 |
+
{file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"},
|
533 |
+
{file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"},
|
534 |
+
]
|
535 |
+
|
536 |
+
[package.dependencies]
|
537 |
+
annotated-types = ">=0.6.0"
|
538 |
+
pydantic-core = "2.27.2"
|
539 |
+
typing-extensions = ">=4.12.2"
|
540 |
+
|
541 |
+
[package.extras]
|
542 |
+
email = ["email-validator (>=2.0.0)"]
|
543 |
+
timezone = ["tzdata"]
|
544 |
+
|
545 |
+
[[package]]
|
546 |
+
name = "pydantic-core"
|
547 |
+
version = "2.27.2"
|
548 |
+
description = "Core functionality for Pydantic validation and serialization"
|
549 |
+
optional = false
|
550 |
+
python-versions = ">=3.8"
|
551 |
+
files = [
|
552 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
|
553 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
|
554 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
|
555 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
|
556 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
|
557 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
|
558 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
|
559 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
|
560 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
|
561 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
|
562 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
|
563 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
|
564 |
+
{file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
|
565 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
|
566 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
|
567 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
|
568 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
|
569 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
|
570 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
|
571 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
|
572 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
|
573 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
|
574 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
|
575 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
|
576 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
|
577 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
|
578 |
+
{file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
|
579 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
|
580 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
|
581 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
|
582 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
|
583 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
|
584 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
|
585 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
|
586 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
|
587 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
|
588 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
|
589 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
|
590 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
|
591 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
|
592 |
+
{file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
|
593 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
|
594 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
|
595 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
|
596 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
|
597 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
|
598 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
|
599 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
|
600 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
|
601 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
|
602 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
|
603 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
|
604 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
|
605 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
|
606 |
+
{file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
|
607 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
|
608 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
|
609 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
|
610 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
|
611 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
|
612 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
|
613 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
|
614 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
|
615 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
|
616 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
|
617 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
|
618 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
|
619 |
+
{file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
|
620 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
|
621 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
|
622 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
|
623 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
|
624 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
|
625 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
|
626 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
|
627 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
|
628 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
|
629 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
|
630 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
|
631 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
|
632 |
+
{file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
|
633 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
|
634 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
|
635 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
|
636 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
|
637 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
|
638 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
|
639 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
|
640 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
|
641 |
+
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
|
642 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
|
643 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
|
644 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
|
645 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
|
646 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
|
647 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
|
648 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
|
649 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
|
650 |
+
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
|
651 |
+
{file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
|
652 |
+
]
|
653 |
+
|
654 |
+
[package.dependencies]
|
655 |
+
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
|
656 |
+
|
657 |
+
[[package]]
|
658 |
+
name = "python-dotenv"
|
659 |
+
version = "1.0.1"
|
660 |
+
description = "Read key-value pairs from a .env file and set them as environment variables"
|
661 |
+
optional = false
|
662 |
+
python-versions = ">=3.8"
|
663 |
+
files = [
|
664 |
+
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
|
665 |
+
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
|
666 |
+
]
|
667 |
+
|
668 |
+
[package.extras]
|
669 |
+
cli = ["click (>=5.0)"]
|
670 |
+
|
671 |
+
[[package]]
|
672 |
+
name = "python-jose"
|
673 |
+
version = "3.3.0"
|
674 |
+
description = "JOSE implementation in Python"
|
675 |
+
optional = false
|
676 |
+
python-versions = "*"
|
677 |
+
files = [
|
678 |
+
{file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"},
|
679 |
+
{file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"},
|
680 |
+
]
|
681 |
+
|
682 |
+
[package.dependencies]
|
683 |
+
cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryptography\""}
|
684 |
+
ecdsa = "!=0.15"
|
685 |
+
pyasn1 = "*"
|
686 |
+
rsa = "*"
|
687 |
+
|
688 |
+
[package.extras]
|
689 |
+
cryptography = ["cryptography (>=3.4.0)"]
|
690 |
+
pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"]
|
691 |
+
pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"]
|
692 |
+
|
693 |
+
[[package]]
|
694 |
+
name = "pyyaml"
|
695 |
+
version = "6.0.2"
|
696 |
+
description = "YAML parser and emitter for Python"
|
697 |
+
optional = false
|
698 |
+
python-versions = ">=3.8"
|
699 |
+
files = [
|
700 |
+
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
|
701 |
+
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
|
702 |
+
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
|
703 |
+
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
|
704 |
+
{file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
|
705 |
+
{file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
|
706 |
+
{file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
|
707 |
+
{file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
|
708 |
+
{file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
|
709 |
+
{file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
|
710 |
+
{file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
|
711 |
+
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
|
712 |
+
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
|
713 |
+
{file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
|
714 |
+
{file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
|
715 |
+
{file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
|
716 |
+
{file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
|
717 |
+
{file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
|
718 |
+
{file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
|
719 |
+
{file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
|
720 |
+
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
|
721 |
+
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
|
722 |
+
{file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
|
723 |
+
{file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
|
724 |
+
{file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
|
725 |
+
{file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
|
726 |
+
{file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
|
727 |
+
{file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
|
728 |
+
{file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
|
729 |
+
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
|
730 |
+
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
|
731 |
+
{file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
|
732 |
+
{file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
|
733 |
+
{file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
|
734 |
+
{file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
|
735 |
+
{file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
|
736 |
+
{file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
|
737 |
+
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
|
738 |
+
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
|
739 |
+
{file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
|
740 |
+
{file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
|
741 |
+
{file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
|
742 |
+
{file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
|
743 |
+
{file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
|
744 |
+
{file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
|
745 |
+
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
|
746 |
+
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
|
747 |
+
{file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
|
748 |
+
{file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
|
749 |
+
{file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
|
750 |
+
{file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
|
751 |
+
{file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
|
752 |
+
{file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
|
753 |
+
]
|
754 |
+
|
755 |
+
[[package]]
|
756 |
+
name = "requests"
|
757 |
+
version = "2.32.3"
|
758 |
+
description = "Python HTTP for Humans."
|
759 |
+
optional = false
|
760 |
+
python-versions = ">=3.8"
|
761 |
+
files = [
|
762 |
+
{file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
|
763 |
+
{file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
|
764 |
+
]
|
765 |
+
|
766 |
+
[package.dependencies]
|
767 |
+
certifi = ">=2017.4.17"
|
768 |
+
charset-normalizer = ">=2,<4"
|
769 |
+
idna = ">=2.5,<4"
|
770 |
+
urllib3 = ">=1.21.1,<3"
|
771 |
+
|
772 |
+
[package.extras]
|
773 |
+
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
774 |
+
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
|
775 |
+
|
776 |
+
[[package]]
|
777 |
+
name = "rsa"
|
778 |
+
version = "4.9"
|
779 |
+
description = "Pure-Python RSA implementation"
|
780 |
+
optional = false
|
781 |
+
python-versions = ">=3.6,<4"
|
782 |
+
files = [
|
783 |
+
{file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"},
|
784 |
+
{file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"},
|
785 |
+
]
|
786 |
+
|
787 |
+
[package.dependencies]
|
788 |
+
pyasn1 = ">=0.1.3"
|
789 |
+
|
790 |
+
[[package]]
|
791 |
+
name = "six"
|
792 |
+
version = "1.17.0"
|
793 |
+
description = "Python 2 and 3 compatibility utilities"
|
794 |
+
optional = false
|
795 |
+
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
|
796 |
+
files = [
|
797 |
+
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
|
798 |
+
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
|
799 |
+
]
|
800 |
+
|
801 |
+
[[package]]
|
802 |
+
name = "sniffio"
|
803 |
+
version = "1.3.1"
|
804 |
+
description = "Sniff out which async library your code is running under"
|
805 |
+
optional = false
|
806 |
+
python-versions = ">=3.7"
|
807 |
+
files = [
|
808 |
+
{file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
|
809 |
+
{file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
|
810 |
+
]
|
811 |
+
|
812 |
+
[[package]]
|
813 |
+
name = "starlette"
|
814 |
+
version = "0.36.3"
|
815 |
+
description = "The little ASGI library that shines."
|
816 |
+
optional = false
|
817 |
+
python-versions = ">=3.8"
|
818 |
+
files = [
|
819 |
+
{file = "starlette-0.36.3-py3-none-any.whl", hash = "sha256:13d429aa93a61dc40bf503e8c801db1f1bca3dc706b10ef2434a36123568f044"},
|
820 |
+
{file = "starlette-0.36.3.tar.gz", hash = "sha256:90a671733cfb35771d8cc605e0b679d23b992f8dcfad48cc60b38cb29aeb7080"},
|
821 |
+
]
|
822 |
+
|
823 |
+
[package.dependencies]
|
824 |
+
anyio = ">=3.4.0,<5"
|
825 |
+
typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""}
|
826 |
+
|
827 |
+
[package.extras]
|
828 |
+
full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"]
|
829 |
+
|
830 |
+
[[package]]
|
831 |
+
name = "tqdm"
|
832 |
+
version = "4.67.1"
|
833 |
+
description = "Fast, Extensible Progress Meter"
|
834 |
+
optional = false
|
835 |
+
python-versions = ">=3.7"
|
836 |
+
files = [
|
837 |
+
{file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
|
838 |
+
{file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
|
839 |
+
]
|
840 |
+
|
841 |
+
[package.dependencies]
|
842 |
+
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
843 |
+
|
844 |
+
[package.extras]
|
845 |
+
dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"]
|
846 |
+
discord = ["requests"]
|
847 |
+
notebook = ["ipywidgets (>=6)"]
|
848 |
+
slack = ["slack-sdk"]
|
849 |
+
telegram = ["requests"]
|
850 |
+
|
851 |
+
[[package]]
|
852 |
+
name = "typing-extensions"
|
853 |
+
version = "4.12.2"
|
854 |
+
description = "Backported and Experimental Type Hints for Python 3.8+"
|
855 |
+
optional = false
|
856 |
+
python-versions = ">=3.8"
|
857 |
+
files = [
|
858 |
+
{file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
|
859 |
+
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
|
860 |
+
]
|
861 |
+
|
862 |
+
[[package]]
|
863 |
+
name = "tzdata"
|
864 |
+
version = "2024.2"
|
865 |
+
description = "Provider of IANA time zone data"
|
866 |
+
optional = false
|
867 |
+
python-versions = ">=2"
|
868 |
+
files = [
|
869 |
+
{file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
|
870 |
+
{file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
|
871 |
+
]
|
872 |
+
|
873 |
+
[[package]]
|
874 |
+
name = "tzlocal"
|
875 |
+
version = "5.2"
|
876 |
+
description = "tzinfo object for the local timezone"
|
877 |
+
optional = false
|
878 |
+
python-versions = ">=3.8"
|
879 |
+
files = [
|
880 |
+
{file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"},
|
881 |
+
{file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"},
|
882 |
+
]
|
883 |
+
|
884 |
+
[package.dependencies]
|
885 |
+
tzdata = {version = "*", markers = "platform_system == \"Windows\""}
|
886 |
+
|
887 |
+
[package.extras]
|
888 |
+
devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
|
889 |
+
|
890 |
+
[[package]]
|
891 |
+
name = "urllib3"
|
892 |
+
version = "2.3.0"
|
893 |
+
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
894 |
+
optional = false
|
895 |
+
python-versions = ">=3.9"
|
896 |
+
files = [
|
897 |
+
{file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
|
898 |
+
{file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
|
899 |
+
]
|
900 |
+
|
901 |
+
[package.extras]
|
902 |
+
brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
|
903 |
+
h2 = ["h2 (>=4,<5)"]
|
904 |
+
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
|
905 |
+
zstd = ["zstandard (>=0.18.0)"]
|
906 |
+
|
907 |
+
[[package]]
|
908 |
+
name = "uvicorn"
|
909 |
+
version = "0.27.1"
|
910 |
+
description = "The lightning-fast ASGI server."
|
911 |
+
optional = false
|
912 |
+
python-versions = ">=3.8"
|
913 |
+
files = [
|
914 |
+
{file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"},
|
915 |
+
{file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"},
|
916 |
+
]
|
917 |
+
|
918 |
+
[package.dependencies]
|
919 |
+
click = ">=7.0"
|
920 |
+
h11 = ">=0.8"
|
921 |
+
typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
|
922 |
+
|
923 |
+
[package.extras]
|
924 |
+
standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
|
925 |
+
|
926 |
+
[metadata]
|
927 |
+
lock-version = "2.0"
|
928 |
+
python-versions = "^3.9"
|
929 |
+
content-hash = "37c06cf18ddd7bd414521d6d939668c0bbb1b189836faa70ce6162a753a8f81b"
|
server/pyproject.toml
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[tool.poetry]
|
2 |
+
name = "leaderboard-explorer-server"
|
3 |
+
version = "0.1.0"
|
4 |
+
description = "Backend server for Leaderboard Explorer"
|
5 |
+
authors = ["Your Name <[email protected]>"]
|
6 |
+
|
7 |
+
[tool.poetry.dependencies]
|
8 |
+
python = "^3.9"
|
9 |
+
fastapi = "^0.109.0"
|
10 |
+
uvicorn = "^0.27.0"
|
11 |
+
python-dotenv = "^1.0.0"
|
12 |
+
requests = "^2.31.0"
|
13 |
+
python-jose = {extras = ["cryptography"], version = "^3.3.0"}
|
14 |
+
apscheduler = "^3.10.4"
|
15 |
+
huggingface-hub = "^0.21.3"
|
16 |
+
|
17 |
+
[build-system]
|
18 |
+
requires = ["poetry-core>=1.0.0"]
|
19 |
+
build-backend = "poetry.core.masonry.api"
|
server/server.py
ADDED
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, HTTPException
|
2 |
+
from fastapi.middleware.cors import CORSMiddleware
|
3 |
+
from apscheduler.schedulers.background import BackgroundScheduler
|
4 |
+
from datetime import datetime
|
5 |
+
import os
|
6 |
+
from dotenv import load_dotenv
|
7 |
+
from huggingface_hub import HfApi
|
8 |
+
import json
|
9 |
+
|
10 |
+
# Load environment variables
|
11 |
+
load_dotenv()
|
12 |
+
|
13 |
+
# API configuration
|
14 |
+
API_HOST = os.getenv("API_HOST", "0.0.0.0")
|
15 |
+
API_PORT = int(os.getenv("API_PORT", "3002"))
|
16 |
+
|
17 |
+
app = FastAPI()
|
18 |
+
|
19 |
+
# Add CORS middleware
|
20 |
+
app.add_middleware(
|
21 |
+
CORSMiddleware,
|
22 |
+
allow_origins=[
|
23 |
+
"http://localhost:5173", # Vite dev server
|
24 |
+
f"http://localhost:{API_PORT}", # API port
|
25 |
+
],
|
26 |
+
allow_credentials=True,
|
27 |
+
allow_methods=["*"],
|
28 |
+
allow_headers=["*"],
|
29 |
+
)
|
30 |
+
|
31 |
+
# Cache storage
|
32 |
+
cache = {
|
33 |
+
"data": None,
|
34 |
+
"last_updated": None
|
35 |
+
}
|
36 |
+
|
37 |
+
# HF API configuration
|
38 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
39 |
+
REPO_ID = "tfrere/leaderboard-explorer"
|
40 |
+
FILE_PATH = "final_leaderboards.json"
|
41 |
+
CACHE_DURATION_MINUTES = int(os.getenv("UPDATE_INTERVAL_MINUTES", "15")) # Get from env or default to 15
|
42 |
+
|
43 |
+
# Initialize HF API client
|
44 |
+
hf_api = HfApi(token=HF_TOKEN)
|
45 |
+
|
46 |
+
def fetch_leaderboards():
|
47 |
+
"""Fetch leaderboards data from Hugging Face"""
|
48 |
+
try:
|
49 |
+
# Download the JSON file directly
|
50 |
+
json_path = hf_api.hf_hub_download(
|
51 |
+
repo_id=REPO_ID,
|
52 |
+
filename=FILE_PATH,
|
53 |
+
repo_type="dataset"
|
54 |
+
)
|
55 |
+
|
56 |
+
with open(json_path, 'r') as f:
|
57 |
+
cache["data"] = json.load(f)
|
58 |
+
cache["last_updated"] = datetime.now()
|
59 |
+
print(f"Cache updated at {cache['last_updated']}")
|
60 |
+
|
61 |
+
except Exception as e:
|
62 |
+
print(f"Error fetching data: {str(e)}")
|
63 |
+
if not cache["data"]: # Only raise if we don't have any cached data
|
64 |
+
raise HTTPException(status_code=500, detail="Failed to fetch leaderboards data")
|
65 |
+
|
66 |
+
# Initialize scheduler
|
67 |
+
scheduler = BackgroundScheduler()
|
68 |
+
scheduler.add_job(fetch_leaderboards, 'interval', minutes=CACHE_DURATION_MINUTES)
|
69 |
+
scheduler.start()
|
70 |
+
|
71 |
+
# Initial fetch
|
72 |
+
fetch_leaderboards()
|
73 |
+
|
74 |
+
@app.get("/api/leaderboards")
|
75 |
+
async def get_leaderboards():
|
76 |
+
"""Get leaderboards data from cache"""
|
77 |
+
if not cache["data"]:
|
78 |
+
fetch_leaderboards()
|
79 |
+
|
80 |
+
return {
|
81 |
+
"data": cache["data"],
|
82 |
+
"last_updated": cache["last_updated"].isoformat() if cache["last_updated"] else None
|
83 |
+
}
|
84 |
+
|
85 |
+
@app.get("/api/health")
|
86 |
+
async def health_check():
|
87 |
+
"""Health check endpoint"""
|
88 |
+
return {
|
89 |
+
"status": "healthy",
|
90 |
+
"cache_status": "initialized" if cache["data"] else "empty",
|
91 |
+
"last_updated": cache["last_updated"].isoformat() if cache["last_updated"] else None
|
92 |
+
}
|
93 |
+
|
94 |
+
if __name__ == "__main__":
|
95 |
+
import uvicorn
|
96 |
+
uvicorn.run("server:app", host=API_HOST, port=API_PORT, reload=True)
|