Redo app to fit FastAPI guidelines

This commit is contained in:
t0xa 2025-09-04 20:48:27 +03:00
parent b5e207fc57
commit 891b14a86b
51 changed files with 486 additions and 3708 deletions

46
.dockerignore Normal file
View file

@ -0,0 +1,46 @@
# Git
.git
.gitignore
# Python
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.pytest_cache
htmlcov
# Virtual environments
.venv
.env
venv/
ENV/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
# Project specific
uv.lock
.mypy_cache
.opencode
# Documentation build
DOCS/
# Keep data directory for testing
!data/

29
Dockerfile Normal file
View file

@ -0,0 +1,29 @@
FROM python:3.13-slim
# Set working directory
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy pyproject.toml first for better caching
COPY pyproject.toml ./
# Install Python dependencies
RUN pip install --no-cache-dir -e .
# Copy application code
COPY ./app ./app
COPY ./data ./data
COPY ./tests ./tests
# Set Python path
ENV PYTHONPATH=/app
# Expose port
EXPOSE 8000
# Command will be overridden by docker-compose
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

7
app/api/v1/api.py Normal file
View file

@ -0,0 +1,7 @@
from fastapi import APIRouter
from app.api.v1.endpoints import parser, health
api_router = APIRouter()
api_router.include_router(health.router, prefix="/health", tags=["health"])
api_router.include_router(parser.router, prefix="/parser", tags=["parser"])

View file

@ -0,0 +1,13 @@
from fastapi import APIRouter
from datetime import datetime
router = APIRouter()
@router.get("/")
async def health_check():
return {
"status": "healthy",
"timestamp": datetime.now().isoformat(),
"service": "fitness-parser-api"
}

View file

@ -0,0 +1,27 @@
from fastapi import APIRouter, HTTPException
from typing import List
from app.schemas.parser import ParseRequest, ParseResponse
from app.core.services.parser_service import ParserService
router = APIRouter()
parser_service = ParserService()
@router.post("/parse", response_model=List[ParseResponse])
async def parse_training_data(request: ParseRequest):
try:
result = await parser_service.parse_data(request)
return result
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/supported-formats")
async def get_supported_formats():
return {
"formats": [
{"name": "apple", "description": "Apple Notes format"},
{"name": "obsidian", "description": "Obsidian Markdown format"},
{"name": "text", "description": "Plain text format"}
]
}

14
app/config.py Normal file
View file

@ -0,0 +1,14 @@
from pydantic_settings import BaseSettings
from typing import Optional
class Settings(BaseSettings):
app_name: str = "Fitness Parser API"
version: str = "0.1.0"
debug: bool = False
class Config:
env_file = ".env"
settings = Settings()

View file

@ -18,5 +18,6 @@ class Training(BaseModel):
date: date
exercises: Optional[List[Exercise]]
class Coach(BaseModel):
name: str

View file

View file

@ -2,9 +2,9 @@ import re
from typing import List, Tuple
from datetime import datetime
from obsidian.py_models import Training
from apple.mapper import unique_apple_exercises_mapper
from parsers.base_parser import BaseNotesParser
from app.core.models.training import Training
from app.core.parsers.apple_mapper import unique_apple_exercises_mapper
from app.core.parsers.base import BaseNotesParser
class AppleNotesParser(BaseNotesParser):

View file

@ -1,8 +1,8 @@
import os
from typing import List, Tuple, Dict, Optional
from obsidian.py_models import Approach, Exercise, Training
from utils.date_refactor import parse_training_date
from app.core.models.training import Approach, Exercise, Training
from app.core.utils.date_refactor import parse_training_date
class BaseNotesParser:

View file

@ -1,9 +1,9 @@
import re
from typing import List, Tuple
from obsidian.py_models import Training
from obsidian.mapper import obsidian_unique_exercies_mapping
from parsers.base_parser import BaseNotesParser
from app.core.models.training import Training
from app.core.parsers.obsidian_mapper import obsidian_unique_exercies_mapping
from app.core.parsers.base import BaseNotesParser
class ObsidianNotesParser(BaseNotesParser):

View file

@ -1,7 +1,7 @@
from typing import List
from apple.notes_parser import AppleNotesParser
from obsidian.notes_parser import ObsidianNotesParser
from obsidian.py_models import Training
from app.core.parsers.apple import AppleNotesParser
from app.core.parsers.obsidian import ObsidianNotesParser
from app.core.models.training import Training
def parse_old_data() -> List[Training]:
"""Method for parsing all old data from apple and obsidian notes with exercise mapping applied

View file

View file

@ -0,0 +1,27 @@
from typing import List
from app.schemas.parser import ParseRequest, ParseResponse, ParseFormat
from app.core.parsers.text_data import parse_old_data
from app.core.parsers.apple import AppleNotesParser
from app.core.parsers.obsidian import ObsidianNotesParser
class ParserService:
def __init__(self):
self._apple_parser = AppleNotesParser()
self._obsidian_parser = ObsidianNotesParser()
async def parse_data(self, request: ParseRequest) -> List[ParseResponse]:
if request.format == ParseFormat.text:
trainings = parse_old_data()
return [ParseResponse(**training.model_dump()) for training in trainings]
elif request.format == ParseFormat.apple:
trainings = self._apple_parser.parse(request.data)
return [ParseResponse(**training.model_dump()) for training in trainings]
elif request.format == ParseFormat.obsidian:
trainings = self._obsidian_parser.parse(request.data)
return [ParseResponse(**training.model_dump()) for training in trainings]
else:
raise ValueError(f"Unsupported format: {request.format}")

View file

16
app/main.py Normal file
View file

@ -0,0 +1,16 @@
from fastapi import FastAPI
from app.api.v1.api import api_router
from app.config import settings
app = FastAPI(
title="Fitness Parser API",
description="API for parsing fitness training data from various sources",
version="0.1.0",
)
app.include_router(api_router, prefix="/api/v1")
@app.get("/")
async def root():
return {"message": "Fitness Parser API", "version": "0.1.0"}

0
app/schemas/__init__.py Normal file
View file

31
app/schemas/parser.py Normal file
View file

@ -0,0 +1,31 @@
from pydantic import BaseModel
from typing import List, Optional
from datetime import date
from enum import Enum
class ParseFormat(str, Enum):
apple = "apple"
obsidian = "obsidian"
text = "text"
class ParseRequest(BaseModel):
data: str
format: ParseFormat
class ApproachResponse(BaseModel):
weight: float
reps: int
class ExerciseResponse(BaseModel):
name: str
splitted_weight: bool = False
approaches: List[ApproachResponse]
class ParseResponse(BaseModel):
date: date
exercises: Optional[List[ExerciseResponse]]

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,36 +0,0 @@
**21.08.2024 (с123-69)**
| | | |
|---|---|---|
|**Упражнение**|**Вес**|**Подходы**|
|Подтягивания|0-37-37|7-10-7|
|Тяга гантелей лежа на животе на скамье 80°|36-48|12-12-12-12|
|Тяга вертикального блока|59|10-9-10|
|Жим от груди сидя в тренажере (рычаги)|40-60-60|12-12-10|
|Баттерфляй|57|12-12-12|
||||
**19.08.2024 (с122-68)**
| | | |
|---|---|---|
|**Упражнение**|**Вес**|**Подходы**|
|Жим ногами|50-100-150-175|12-12-12-12-8|
|Румынская тяга|22х2|12-12-12|
|Разведение рук в стороны в тренажёре Дж|47|12-12-12|
|Жим гантелей сидя 80⁰|16х2|12-12-12|
||||
||||
**21.06.23 (с3)**
| | | |
| ------------------------- | -------- | ----------- |
| Упражнение | Вес | Подходы |
| Гравитрон | 57-57-77 | 7-6-10 |
| Тяга гантелей в наклоне | 7-8-8-8 | 13-13-12-12 |
| Отжимания | | 8-6-7-5.5 |
| Тяга ногами | 41 | 12-12-12-12 |
| Гиперэкстензия | 0-10-10 | 12-12-12 |
| Подъем коленей на турнике | | 10-10-10 |

8
compose.override.yaml Normal file
View file

@ -0,0 +1,8 @@
# Development overrides for hot reload
version: '3.8'
services:
fastapi-app:
environment:
- DEBUG=true
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --reload-dir /app/app --log-level debug

View file

@ -1,11 +1,23 @@
version: '3'
version: '3.8'
services:
database:
image: 'postgres:latest'
fastapi-app:
build:
context: .
dockerfile: Dockerfile
ports:
- 5433:5432
env_file:
- .env
- "8000:8000"
volumes:
- ./app:/app/app:ro
- ./data:/app/data:ro
- ./tests:/app/tests:ro
environment:
POSTGRES_DB: fitness_database
- PYTHONPATH=/app
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --reload-dir /app/app
develop:
watch:
- action: sync
path: ./app
target: /app/app
- action: rebuild
path: ./pyproject.toml

View file

@ -1,37 +0,0 @@
from sqlalchemy import Float, ForeignKey, String, Table, Column, Integer, MetaData, Date
# NOTE: MetaData object - object where we place out tables
# Essentialy - this is a facade around Python dicts, that stores series of Table objects keyed to their string name
metadata_obj = MetaData()
# Representation of training table
training = Table(
"training",
metadata_obj,
Column("Id", Integer, primary_key=True),
Column("Date", Date),
)
# Representation of exercise table
exercise = Table(
"exercise",
metadata_obj,
Column("Id", Integer, primary_key=True),
Column("Training", ForeignKey("training.Id"), nullable=False),
Column("Name", String(256)),
)
approach = Table(
"approach",
metadata_obj,
Column("Id", Integer, primary_key=True),
Column("Exercise", ForeignKey("exercise.Id"), nullable=False),
Column("Weight", Float),
Column("Reps", Integer),
)
# NOTE: We can access table metadata with associative array `c`
# print(training.c.keys())
# print(training.primary_key)
print(training.name)

84
elect
View file

@ -1,84 +0,0 @@
1 | 1 | 77 | 12
2 | 1 | 86 | 12
3 | 1 | 91 | 12
4 | 1 | 86 | 12
5 | 2 | 47 | 12
6 | 2 | 47 | 12
7 | 2 | 47 | 11
8 | 2 | 47 | 10
9 | 3 | 15 | 12
10 | 3 | 25 | 12
11 | 3 | 27.5 | 12
12 | 3 | 30 | 8
13 | 4 | 9 | 12
14 | 4 | 11 | 12
15 | 4 | 12 | 12
16 | 5 | 33 | 12
17 | 5 | 33 | 12
18 | 5 | 33 | 12
19 | 5 | 33 | 12
20 | 6 | 0 | 9
21 | 6 | 0 | 7
22 | 6 | 0 | 5
23 | 7 | 55 | 12
24 | 7 | 59 | 12
25 | 7 | 59 | 12
26 | 7 | 59 | 10
27 | 8 | 18 | 12
28 | 8 | 20 | 12
29 | 8 | 20 | 11
30 | 9 | 47 | 12
31 | 9 | 47 | 12
32 | 9 | 47 | 12
33 | 10 | 77 | 12
34 | 10 | 77 | 12
35 | 10 | 77 | 12
36 | 11 | 0 | 11
37 | 11 | 0 | 8
38 | 11 | 0 | 6
39 | 12 | 22 | 12
40 | 12 | 28 | 10
41 | 12 | 28 | 10
42 | 12 | 28 | 10
43 | 13 | 16 | 12
44 | 13 | 28 | 10
45 | 13 | 28 | 6
46 | 13 | 28 | 7
47 | 14 | 47 | 12
48 | 14 | 47 | 12
49 | 14 | 47 | 12
50 | 15 | 65 | 12
51 | 15 | 82 | 12
52 | 15 | 91 | 12
53 | 16 | 100 | 12
54 | 16 | 150 | 10
55 | 16 | 150 | 10
56 | 16 | 150 | 10
57 | 17 | 15 | 12
58 | 17 | 15 | 12
59 | 17 | 15 | 12
60 | 18 | 12 | 12
61 | 18 | 20 | 10
62 | 18 | 20 | 10
63 | 18 | 20 | 10
64 | 19 | 47 | 11
65 | 19 | 47 | 11
66 | 19 | 47 | 12
67 | 20 | 45 | 12
68 | 20 | 54 | 12
69 | 20 | 59 | 10
70 | 20 | 59 | 10
71 | 21 | 30 | 10
72 | 21 | 32 | 10
73 | 21 | 32 | 10
74 | 22 | 50 | 12
75 | 22 | 50 | 12
76 | 22 | 50 | 12
77 | 23 | 16 | 12
78 | 23 | 24 | 10
79 | 23 | 24 | 10
80 | 23 | 24 | 10
81 | 24 | 47 | 12
82 | 24 | 47 | 12
83 | 24 | 47 | 12

View file

@ -1,3 +0,0 @@
POSTGRES_USER=db_username
POSTGRES_PASSWORD=db_password

View file

@ -1,18 +0,0 @@
from concurrent.futures import ThreadPoolExecutor
import grpc
from api.proto import routes_pb2, routes_pb2_grpc
class RouteApproachesServicer(routes_pb2_grpc.RouteApproachesServicer):
def GetApproach(self, request, context):
print("Hello")
return routes_pb2.Approach(weight=100, reps=12)
def serve():
server = grpc.server(ThreadPoolExecutor(max_workers=10))
routes_pb2_grpc.add_RouteApproachesServicer_to_server(RouteApproachesServicer(), server)
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination()
serve()

27
main.py
View file

@ -1,27 +0,0 @@
from parsers.text_data_parser import parse_old_data
from collections import Counter
text_trainings = parse_old_data()
with open("parsed_trainings.txt", "w", encoding="utf-8") as f:
f.write("=== ALL PARSED TRAININGS ===\n")
for training in text_trainings:
f.write(f"\nDate: {training.date}\n")
for exercise in training.exercises:
split_info = " (splitted weight)" if exercise.splitted_weight else ""
f.write(f" Exercise: {exercise.name}{split_info}\n")
for approach in exercise.approaches:
f.write(f" Approach: {approach.weight}kg x {approach.reps} reps\n")
f.write(f"\nTotal trainings: {len(text_trainings)}\n")
exercise_names = []
for training in text_trainings:
for exercise in training.exercises:
exercise_names.append(exercise.name)
exercise_counts = Counter(exercise_names)
f.write("\nExercise counts:\n")
for name, count in sorted(exercise_counts.items()):
f.write(f"{name}: {count}\n")
print("Output saved to parsed_trainings.txt")

View file

@ -1,526 +0,0 @@
# 07.01.2025 (solo-2)
| Упражнение | Вес | Подходы |
| --------------------------------------- | --------------------- | ----------- |
| Разгибание ног сидя | 77-86-91-86 | 12-12-12-12 |
| Сгибание ног лежа | 47 | 12-12-11-10 |
| Жим от груди (рычаги) | 15х2-25х2-27.5х2-30х2 | 12-12-12-8 |
| Отведение руки в кроссовере из за спины | 9-11-12 | 12-12-12 |
| Кроссовер - отжимание на трицепс | 33 | 12-12-12-12 |
# 04.01.2025 (solo-1)
| Упражнение | Вес | Подходы |
| --------------------------------------- | --------- | -------------- |
| Подтягивания | | 9-7-5 |
| Тяга горизонтального блока | 55-59 | 12-12-12-10 |
| Тяга гантели в наклоне одной рукой | 30 | 10х2-10х2-10х2 |
| Жим гантелей лежа | 18х2-20х2 | 12-12-11 |
| Разведение рук в стороны (дельт машина) | 47 | 12-12-12 |
| Трицепс машина | 77 | 12-12-12 |
# 30.12.2024 (c166-115)
| Упражнение | Вес | Подходы |
| ----------------------- | --------- | ----------- |
| Подтягивания | | 11-8-6 |
| Тяга гантелей на скамье | 22х2-28х2 | 12-10-10-10 |
| Жим гантелей лежа | 16х2-28х2 | 12-10-6-7 |
| Сведение рук пек дек | 47 | 12-12-12 |
| Брусья 37 | 11-1011-10-10 |
# 27.12.2024 (c165-114)
| Упражнение | Вес | Подходы |
| ------------------------ | --------- | ----------- |
| Разгибание ног сидя | 65-82-91 | 12-12-12 |
| Жим ногами | 100-150 | 12-10-10-10 |
| Гиперэкстензия | 15 | 12-12-12 |
| Жим гантелей сидя | 12х2-20х2 | 12-10-10-10 |
| Разведение рук в стороны | 47 | 11-11-12 |
# 25.12.2024 (c164-113)
| Упражнение | Вес | Подходы |
| ---------------------------------- | --------- | ----------- |
| Тяга вертикального блока | 45-54-59 | 12-12-10-10 |
| Тяга гантели в наклоне одной рукой | 30-32 | 10-10-10 |
| Тяга горизонтального блока | 50 | 12-12-12 |
| Жим гантелей лежа | 16х2-24х2 | 12-10-10-10 |
| Сведение рук пек дек | 47 | 12-12-12 |
| | | |
# 20.12.2024 (с163-112)
| Упражнение | Вес | Подходы |
| ---------------------------------------------- | ----------- | -------- |
| Тяга вертикального блока | 41-59 | 12-12-12 |
| Тяга гантели в наклоне одной рукой | 28-32 | 12-8-8 |
| Жим гантелей лёжа | 14x14-26x26 | 12-8-8-8 |
| Баттерфляй | 57 | 12-12-12 |
| Сгибание рук с гантелями стоя (супинирование?) | 10х2 | 12-12-12 |
| Трицепс машина | 67 | 12-12-12 |
# 18.12.2024 (c162-111)
| Упражнение | Вес | Подходы |
| -------------------------------------------------------------- | --------- | ----------- |
| Разгибание ног сидя | 77-91 | 12-12-12-11 |
| Сгибание ног лежа | 47 | 12-12-10 |
| Жим гантелей сидя | 12х2-20х2 | 12-12-11-11 |
| Отведение руки в сторону (дефоли) в кроссовере | 13.5 | 12-12-12 |
| Отведение руки назад в кроссовере (аналог пек дек одной рукой) | 9 | 12-12-12 |
# 16.12.2024 (c161-110)
| Упражнение | Вес | Подходы |
| ----------------------------------------- | ------- | ----------- |
| Подтягивания | | 10-7-6 |
| Тяга горизонтального блока | 59 | 12-12-12 |
| Гребная тяга с упором в грудь (одна рука) | 20-22.5 | 12-11-12 |
| Жим от груди сидя (рычаги) | 30-60 | 12-10-11-10 |
| Трицепс машина | 77 | 12-12 |
# 13.12.2024 (c160-109)
| Упражнение | Вес | Подходы |
| ---------------------- | ---------- | -------- |
| Разгибание ног сидя | 49-81-90 | 12-12-12 |
| Жим ногами | 75-125-150 | 12-12-10 |
| Гиперэкстензия | 10-15 | 12-12-12 |
| Мах руки в кроссовере | 13.9 | 12-12-12 |
| Дельт машина | 47 | 12-11-12 |
| Разведение рук пек дек | 37 | 9-9-8 |
# 11.12.2024 (c159-108)
| Упражнение | Вес | Подходы |
| -------------------------------------- | ------- | -------- |
| Подтягивания | | 10-7-6 |
| Тяга горизонтального блока | 49-58 | 10-12-12 |
| Тяга горизонтального блока одной рукой | 31.8-36 | 12-10-10 |
| Жим от груди сидя в тренажёре (рычаги) | 50-60 | 12-10-8 |
| Сведение рук пёк дек | 47 | 10-9-10 |
| Брусья | 37 | 10 |
# 09.12.2024 (c158-107)
| Упражнение | Вес | Подходы |
| --------------------------------------- | ----------- | ----------- |
| Сгибание ног сидя | 54-77-91-86 | 12-12-11-12 |
| Жим ногами ш-ш-ш | 50-125-140 | 12-12-12-12 |
| Сгибание ног лежа | 47 | 12-12-12 |
| Разведение рук в стороны (дельт-машина) | 37-47 | 12-12-12-12 |
| Жим гантелей сидя | 18х2 | 12-11-10 |
# 06.12.2024 (c157-106)
| Упражнение | Вес | Подходы |
| ---------------------------------- | -------- | -------- |
| Тяга вертикального блока | 40-54 | 12-12-12 |
| Тяга гантели в наклоне одной рукой | 26-28 | 10-10-10 |
| Тяга горизонтального блока | 59 | 12-12-12 |
| Жим от груди сидя рычаги | 30-70-60 | 12-6-7-7 |
| Баттерфляй | 57 | 12-12-8 |
| Трицепс машина | 77 | 12-12-11 |
# 04.12.2024 (c156-105)
| Упражнение | Вес | Подходы |
| --------------------------------------- | -------------- | ----------- |
| Жим ногами | 50-100-125-150 | 12-12-12-12 |
| Разгибание ног сидя | 77-87 | 12-12-12 |
| Сгибание ног сидя | 81 | 12-12-12 |
| Разведение рук в стороны (дельт-машина) | 37-47 | 12-12-12-12 |
| Жим от плеч вверх (тренажёр, рычаги) | 37 | 12-11-10 |
# 02.12.2024 (c155-104)
| Упражнение | Вес | Подходы |
| ---------------------------------- | --------- | --------- |
| Подтягивания | | 10-7-6 |
| Тяга горизонтального блока | 59 | 12-12-12 |
| Тяга гантели в наклоне одной рукой | 26 | 10-10-10 |
| Жим гантелей лёжа | 16х2-24х2 | 12-10-8-5 |
| Баттерфляй | 57 | 12-12-12 |
# 27.11.2024 (c154-103)
| Упражнение | Вес | Подходы |
| --------------------------------------- | -------- | ---------- |
| Разгибание ног сидя | 72-77-81 | 12-12-12 |
| Сгибание ног лежа | 37-47 | 12-12-10 |
| Икроножные сидя | 34 | 12-12-12 |
| Разведение рук в строоны (дельт-машина) | 37-47 | 12-12-12-9 |
| Жим гантелей сидя 85⁰ | 18х2 | 10-8-7 |
| Разведение рук назад пёк дек | 27-37 | 12-8 |
# 22.11.2024 (c153-102)
| Упражнение | Вес | Подходы |
| -------------------------------------- | -------------------- | -------- |
| Подтягивания | 0-0-зелёная резинка- | 9-7-7 |
| Тяга горизонтально блока одной рукой | 32 | 12-12-12 |
| Тяга вертикального блока прямым хватом | 47-57 | 12-9-9 |
| Жим от плеч сидя (рычаги наверху) | 77-87-77 | 12-10-11 |
| Баттерфляй | 57 | 12-12-12 |
| Трицепс машина | 77 | 12-12 |
# 22.11.2024 (c153-102)
| Упражнение | Вес | Подходы |
| -------------------------------------- | -------------------- | ------------ |
| Подтягивания | 0-0-зелёная резинка- | 9-7-7 |
| Тяга горизонтально блока одной рукой | 32 | 12-12-12 |
| Тяга вертикального блока прямым хватом | 47-57 | 12-9-9 |
| Жим от плеч сидя (рычаги наверху) | 77-87-77 | 12-10-11 |
| Баттерфляй | 57 | 12-12-12 |
| Трицепс машина | 77 | 12-12-==12== |
# 20.11.2024 (c152-101)
| Упражнение | Вес | Подходы |
| -------------------------------------- | -------------- | ----------- |
| Разгибание ног сидя | 58-72-81 | 12-12-10-10 |
| Сгибание ног сидя | 72-81 | 12-12-12 |
| Отведение плеча в сторону в кроссовере | 21-23 | 12-12-12 |
| Жим гантелей сидя | 18х2-18х2-16х2 | 9-10-12 |
| Разведение рук назад в пек дек | 37 | 9-8-9 |
# 18.11.2024 (c151-100)
| Упражнение | Вес | Подходы |
| --------------------------------- | --------- | --------- |
| Подтягивания | | 10 |
| Подтягивания обратным хватом | | 7-6 |
| Вертикальная тяга одной рукой 45⁰ | 31-41 | 12-12-12 |
| Тяга горизонтального блока | 63-58-54 | 7-9-12 |
| Жим гантелей лёжа на скамейке 45⁰ | 16х2-22х2 | 12-10-8-8 |
| Баттерфляй | 47 | 12-12-12 |
| Брусья | 37-0-37 | 10-5-8 |
# 15.11.2024 (c150-99)
| Упражнение | Вес | Подходы |
| ---------------------------------------- | ----------- | --------------- |
| Выпады вперед на одну ногу | 0-12х2-16х2 | 8х2-8х2-7х2-7х2 |
| Сгибание ног сидя | 77-81 | 12-12-12 |
| Разведение рук в стророны (дельт-машина) | 37-47 | 12-12-12-9 |
| Жим гантелей сидя 80⁰ | 18х2 | 10-9-8 |
| Разведение рук пек дек | 37-27 | 9-12-12 |
| Подъём ног в висе | | 10-10-8 |
# 13.11.2024 (c149-98)
| Упражнение | Вес | Подходы |
| -------------------------- | --------- | -------- |
| Гравитрон (медленно вниз) | 47-37 | 12-9-7 |
| Тяга горизонтального блока | 58 | 12-12-12 |
| Тяга гантели в наклоне | 26х2-28х2 | 12-10-10 |
| Жим гантелей на скамье 65⁰ | 14х2-22х2 | 12-9-8-8 |
| Баттерфляй | 47 | 12-12-12 |
# 11.11.2024 (c148-97)
| Упражнение | Вес | Подходы |
| --------------------------------------- | ---------- | ----------- |
| Разгибание ног сидя | 49-72.5-82 | 12-12-12-12 |
| Румынская тяга | 22х2 | 12-12-12 |
| Икроножные сидя за | 34 | 12-12-12 |
| Дельт машина (разведение рук в стороны) | 47 | 12-12-12 |
| Жим гантелей сидя 80⁰ | 20х2-18х2 | 7-9-10 |
# 08.11.2024 (solo-96)
| Упражнение | Вес | Подходы |
| -------------------------- | --------- | -------- |
| Подтягивания | | 10-7-5 |
| Тяга гантели в наклоне | 24-26 | 12-12-12 |
| Жим гантелей лежа | 20х2-22х2 | 12-12-9 |
| Тяга горизонтального блока | 47-47-57 | 12-12-12 |
| Тяга вертикального блока | 47 | 12-12-12 |
| Жим от плеч вверх рычаги | 37 | 12-11-8 |
# 06.11.2024 (c147-95)
| Упражнение | Вес | Подходы |
| ----------------------------- | -------------- | ----------- |
| Жим ногами | 50-100-100-125 | 12-12-12-12 |
| Сгибание ног лёжа | 47 | 12-12-10 |
| Жим гантелей сидя на скамье | 12х2-20х2 | 12-9-9-8 |
| Разведение рук в стороны сидя | 37 | 12-12-12 |
| Разведение рук пек дек | 37-27 | 8-15-12 |
# 04.11.2024 (c146-94)
| Упражнение | Вес | Подходы |
| -------------------------- | -------- | ----------- |
| Подтягивания | | 9-7-6 |
| Тяга горизонтального блока | 45-54 | 12-12-12 |
| Тяга вертикального блока | 49 | 12-12-12 |
| Жим от груди рычаги | 57-77-87 | 12-12-12-12 |
| Сведение пек дек | 47 | 10-8-8 |
| Брусья | 47 | 12-12-12 |
# 01.11.2024 (c145-93)
| Упражнение | Вес | Подходы |
| --------------------------------------- | ----------- | --------- |
| Выпады с гантелями на одну ногу вперед | 12х12-16х16 | 8-8-8 |
| Гиперэкстензия | 10 | 12-12-12 |
| Жим гантелей сидя | 12х2-20х2 | 12-11-9-8 |
| Разведение рук в стороны (дельт-машина) | 37-47-37 | 12-8-12 |
| Разведение рук пек дек | 27 | 12-12 |
# 30.10.2024 (c144-92)
| Упражнение | Вес | Подходы |
| -------------------------------------- | ----- | -------- |
| Гравитрон | 47-37 | 12-11-9 |
| Гребная тяга с упором в грудь | 47 | 12-12-12 |
| Тяга горизонтального блока одной рукой | 27 | 12-12-12 |
| Отжимания | 15 | 9-7-7 |
| Баттерфляй | 57-47 | 10-12-12 |
| Брусья | 37 | 12-11 |
# 28.10.2024 (c143-91)
| Упражнение | Вес | Подходы |
| --------------------------------------- | ---------- | ----------- |
| Разгибание ног сидя | 49-77-90.5 | 12-12-10-10 |
| Сгибание ног сидя | 58-72-77 | 12-12-12-12 |
| Икроножные сидя | 27-34 | 12-12-12-12 |
| Разведение рук пек дек | 27 | 12-12-12 |
| Разведение рук в стороны (дельт-машина) | 27 | 12-12-12 |
| | | |
# 26.10.2024 (solo-90)
| Упражнение | Вес | Подходы |
| ----------------------------------------- | ----------- | ---------- |
| Подтягивания | | 9-7-6 |
| Тяга горизонтального блока | 57 | 12-12-12 |
| Тяга гантели в наклоне | 26 | 12-12-12 |
| Жим от груди сидя в тренажёре (рычаги) | 40-60-60-40 | 12-11-9-10 |
| Разведение рук в стороны с гантелями стоя | 9х2 | 12-12-12 |
| Трицепс машина | 77-87 | 12-12-9 |
# 23.10.2024 (solo-89)
| Упражнение | Вес | Подходы |
| ------------------------------ | -------- | ----------- |
| Разгибание ног сидя | 72-78-81 | 12-12-12-12 |
| Икроножные сидя | 27-34 | 12-12-12-12 |
| Сгибание штанги стоя на бицепс | 20 | 12-12-12-12 |
| Сгибание ног лёжа | 37 | 12-12-11-10 |
| Гиперэкстензия | 10 | 12-12-12-12 |
# 21.10.2024 (c142-88)
| Упражнение | Вес | Подходы |
| ---------------------------------------- | ----- | -------- |
| Подтягивания | | 10-6-6 |
| Тяга гантели лежа в наклоне на скамье | 22х2 | 12-12-12 |
| Тяга вертикального блока обратным хватом | 54.4 | 12-12-12 |
| Жим от груди сидя (рычаги) | 67-87 | 12-12-12 |
| Баттерфляй | 57 | 12-12-12 |
| Трицепс машина | 77 | 12-12-12 |
# 18.10.2024 (c141-87)
| Упражнение | Вес | Подходы |
| ------------------------------------- | --------- | ----------- |
| Выпады вперед по очереди каждой ногой | 0-20 | 12-16-16-16 |
| Гиперэкстензия | 10 | 12-12-12 |
| Жим гантелей сидя 90⁰ | 12х2-18х2 | 12-12-12-10 |
| Разведение рук в стороны в тренажаре | 37 | 12-12-12 |
| Разведение рук пёк дек | 27 | 12-12-12 |
# 16.10.2024 (c140-86)
| Упражнение | Вес | Подходы |
| ------------------------------------ | ---------------- | ----------- |
| Подтягивания обратным хватом | | 11-8-6 |
| Тяга горизонтального блока | 57 | 12-11-12 |
| Тяга вертикального блока | 54-59-54 | 12-8-12 |
| Жим от груди рычаги | 15х2-25х2-27.5х2 | 12-12-12-11 |
| Сведение рук пек дек | 37 | 12-12-12 |
| Разгибание рук сидя (трицепс машина) | 77-87 | 12-10-9 |
# 14.10.2024 (c139-85)
| Упражнение | Вес | Подходы |
| ----------------------------- | -------------- | ----------- |
| Жим ногами | 75-150 | 12-12-12-12 |
| Сгибание ног лежа | 47-47-37 | 12-10-12 |
| Икроножные сидя | 34 | 12-12-12 |
| Разведение рук в стороны | 37 | 12-12-12 |
| Жим гантелей сидя | 18х2-18х2-16х2 | 12-10-10 |
| Разведение рук в наклоне сидя | 6х2 | 12 |
# 11.10.2024 (c138-84)
| Упражнение | Вес | Подходы |
| ---------------------------- | -------------- | --------- |
| Подтягивания | | 10-6-6 |
| Гребная тяга с упорм в грудь | 47-51 | 12-12-12 |
| Тяга гантели в наклоне | 26-28 | 12-12-12 |
| Жим гантелей лёжа | 18х2-24х2-22х2 | 12-10-7-8 |
| Сведение рук в пек дек | 37 | 12-12-12 |
| Брусья узким хватом | 37 | 12-9-9 |
# 09.10.2024 (c137-83)
| Упражнение | Вес | Подходы |
| ----------------------------- | -------- | ----------- |
| Разгибание ног сидя | 62-82-90 | 12-12-11-10 |
| Румынская тяга | 40 | 12-12-12 |
| Икроножные сидя | 27 | 16-15-14 |
| Разведение рук а стороны сидя | 47 | 12-12-12 |
| Жим гантелей сидя | 18х2 | 11-12-12 |
| Разведение рук в наклоне | 7х2 | 12-12-12 |
# 07.10.2024 (c136-82)
| Упражнение | Вес | Подходы |
| ------------------------------ | -------- | ---------- |
| Подтягивания | | 10-7-6 |
| Гребная тяга с упорм в грудь | 47 | 12-12-12 |
| Тяга гантели в наклоне 1 рукой | 26 | 12-12-12 |
| Жим гантелей лежа на скамье | 40-48 | 12-10-8-7 |
| Баттерфляй | 57-67-57 | 12-7-10-10 |
| | | |
# 04.10.2024 (c135-81)
| Упражнение | Вес | Подходы |
| ------------------------ | ---------- | ----------- |
| Разгибание ног сидя | 59-77-81.5 | 12-12-12-12 |
| Румынская тяга | 40 | 12-12-12 |
| Икроножные сидя | 27.2 | 12-12-12 |
| Жим гантелей сидя | 32-36 | 12-12-12 |
| Разведение рук в стороны | 47 | 12-12-10 |
# 02.10.2024 (c134-80)
| Упражнение | Вес | Подходы |
| ---------------------------------- | ----- | -------- |
| Подтягивания | | 10-7-5 |
| Тяга гантели в наклоне одной рукой | 24-26 | 12-12-12 |
| Тяга верхнего блока | 54-49 | 12-9-12 |
| Жим от груди рычаги | 77-87 | 12-12-11 |
| Брусья | 0-47 | 4-10 |
# 25.09.2024 (c133-79)
| Упражнение | Вес | Подходы |
| ------------------------------------- | -------- | ----------- |
| Разгибание ног сидя | 67-87-97 | 12-12-12-12 |
| Гиперэкстензия | 10 | 12-12-12 |
| Жим гантелей сидя 80⁰ | 36 | 12-12-10 |
| Отведение руки в пек дек (по очереди) | 11 | 12-12-12 |
| Разведение рук пек дек | 27 | 12 |
# 23.09.2024 (c132-78)
| Упражнение | Вес | Подходы |
| --------------------------------------- | -------- | ---------- |
| Подтянивания | | 10-7-5 |
| Тяга горизонтального блока | 47-57 | 12-12-12 |
| Тяга гантели в наклоне к поясу к стойки | 26 | 12-12-12 |
| Жим от груди рычаги | 40-60 | 12-12-9-11 |
| Сведение рук пек дек | 37-47-37 | 12-9-12 |
# 11.09.2024 (c131-77)
| Упражнение | Вес | Подходы |
| ------------------------------------- | ----------- | --------- |
| Подтягивания | | 11-8-7 |
| Гребная тяга с упором в грудь | 47 | 12-12-12 |
| Тяга верхнего блока за | 58.9 | 10-10-10 |
| Жим от плеч сидя в тренажере (рычаги) | 40-70-70-60 | 12-11-9-9 |
| Сведение рук в пек декх | 37-47 | 12-11-10 |
| Трицепс машина | 77 | 12-12-12 |
# 09.09.2024 (c130-76)
| Упражнение | Вес | Подходы |
| ---------------------------------- | ----- | ----------- |
| Болгарские приседания на одну ногу | 16-25 | 10-10-10 |
| Гиперэкстензия | 15 | 12-12-12 |
| Жим гантелей сидя 8⁰ | 16-36 | 10-12-12-12 |
| Разведение рук в стороны стоя | 20 | 12-12-12-12 |
| Разведение рук в наклоне | 8х8 | 12-12-12 |
# 06.09.2024 (c129-75)
| Упражнение | Вес | Подходы |
| ---------------------------------------------- | ----------- | -------- |
| Подтягивания | 0 | 11-8-7-4 |
| Тяга гантелей к поясу лёжа на животе на скамье | 40-52 | 12-12-12 |
| Тяга горизонтального блока 1 рукой поочерёдно | 32 | 12-12-12 |
| Жим гантелей лежа на скамье | 36-52-52-44 | 12-8-6-8 |
| Баттерфляй | 57-47 | 12-9-12 |
# 04.09.2024 (c128-74)
| Упражнение | Вес | Подходы |
| -------------------------------------------------- | -------- | ----------- |
| Разгибание ног сидя | 77-77-95 | 12-12-10-10 |
| Приседания | 30 | 12-12-12 |
| Сгибание ног лежа | 47 | 12-12-10 |
| Отведение руки в пек дек (по очереди каждой рукой) | 13.6 | 12-12-12 |
| Жим от плеч вверх в тренажёре | 37 | 12-12-10 |
| Разведение рук в наклоне | 8х8 | 12-12-12 |
# 02.09.2024 (c127-73)
| Упражнение | Вес | Подходы |
| -------------------------- | ----------- | --------- |
| Подтягивания | 0 | 9-6-6 |
| Тяга гантелей в наклоне | 30 | 12-12-10 |
| Тяга горизонтального блока | 45.3 | 12-10-12 |
| Жим от плеч вверх рычаги | 40-70-70-60 | 12-10-9-9 |
| Баттерфляй | 57 | 12-12-12 |
| Брусья узким хватом | 37 | 9-8-10 |
# 30.08.2024 (c126-72)
| Упражнение | Вес | Подходы |
| ------------------------------------------------ | -------- | ----------- |
| Разгибание ног сидя | 59-77-86 | 12-12-12-12 |
| Жим ногами | 150 | 12-12-12 |
| Сгибание ног лежа | 47 | 12-12-12 |
| Разведение рук в стороны сидя спиной к тренажеру | 47 | 12-12-12 |
| Жим гантелей сидя на лавке 80⁰ | 18х2 | |
# 28.08.2024 (c125-71)
| Упражнение | Вес | Подходы |
| ------------------------------------------- | -------------- | --------- |
| Подтягивания | 0 | 9-7-6 |
| Тяга горизонтального блока | 57 | 12-12-12 |
| Тяга гантели в наклоне одной рукой (каждой) | 24-26 | 12-12-12 |
| Жим гантелей лежа на скамье 30⁰ | 18х2-24х2-22х2 | 12-9-10-8 |
| Сведение рук пек дек | 47 | 12-12-10 |
| | | |
# 26.08.2024 (с124-70)
| Упражнение | Вес | Подходы |
| -------------------------------------------------- | ----------- | ----------- |
| Сгибание ног лежа | 37-47 | 12-12-12 |
| Жим ногами | 100-150-175 | 12-10-10-10 |
| Отведение руки в кроссовере по очереди каждую руку | 13.6 | 12-12-12-12 |
| Жим от плеч вверх в тренажёре | 37 | 12-12-10 |
| Разведение рук в стороны в наклоне с гантелями | 8х2 | 12-12 |
# 21.08.2024 (с123-69)
| Упражнение | Вес | Подходы |
| ------------------------------------------ | -------- | ----------- |
| Подтягивания | 0-37-37 | 7-10-7 |
| Тяга гантелей лежа на животе на скамье 80° | 36-48 | 12-12-12-12 |
| Тяга вертикального блока | 59 | 10-9-10 |
| Жим от груди сидя в тренажере (рычаги) | 40-60-60 | 12-12-10 |
| Баттерфляй | 57 | 12-12-12 |

View file

@ -1,53 +0,0 @@
# 07.01.2025 (solo-2)
| Упражнение | Вес | Подходы |
| --------------------------------------- | --------------------- | ----------- |
| Разгибание ног сидя | 77-86-91-86 | 12-12-12-12 |
| Сгибание ног лежа | 47 | 12-12-11-10 |
| Жим от груди (рычаги) | 15х2-25х2-27.5х2-30х2 | 12-12-12-8 |
| Отведение руки в кроссовере из за спины | 9-11-12 | 12-12-12 |
| Кроссовер - отжимание на трицепс | 33 | 12-12-12-12 |
# 04.01.2025 (solo-1)
| Упражнение | Вес | Подходы |
| --------------------------------------- | --------- | -------------- |
| Подтягивания | | 9-7-5 |
| Тяга горизонтального блока | 55-59 | 12-12-12-10 |
| Тяга гантели в наклоне одной рукой | 30 | 10х2-10х2-10х2 |
| Жим гантелей лежа | 18х2-20х2 | 12-12-11 |
| Разведение рук в стороны (дельт машина) | 47 | 12-12-12 |
| Трицепс машина | 77 | 12-12-12 |
# 30.12.2024 (c166-115)
| Упражнение | Вес | Подходы |
| ----------------------- | --------- | ----------- |
| Подтягивания | | 11-8-6 |
| Тяга гантелей на скамье | 22х2-28х2 | 12-10-10-10 |
| Жим гантелей лежа | 16х2-28х2 | 12-10-6-7 |
| Сведение рук пек дек | 47 | 12-12-12 |
| Брусья 37 | 11-1011-10-10 |
# 27.12.2024 (c165-114)
| Упражнение | Вес | Подходы |
| ------------------------ | --------- | ----------- |
| Разгибание ног сидя | 65-82-91 | 12-12-12 |
| Жим ногами | 100-150 | 12-10-10-10 |
| Гиперэкстензия | 15 | 12-12-12 |
| Жим гантелей сидя | 12х2-20х2 | 12-10-10-10 |
| Разведение рук в стороны | 47 | 11-11-12 |
# 25.12.2024 (c164-113)
| Упражнение | Вес | Подходы |
| ---------------------------------- | --------- | ----------- |
| Тяга вертикального блока | 45-54-59 | 12-12-10-10 |
| Тяга гантели в наклоне одной рукой | 30-32 | 10-10-10 |
| Тяга горизонтального блока | 50 | 12-12-12 |
| Жим гантелей лежа | 16х2-24х2 | 12-10-10-10 |
| Сведение рук пек дек | 47 | 12-12-12 |
| | | |

View file

@ -1,3 +0,0 @@
# Directory for testing hypotheses
## context.py
File for testing context operations

View file

@ -1,66 +0,0 @@
import asyncio
class ContextPlayground:
def __init__(self) -> None:
self.keka = "Hi, i am keka"
def __enter__(self):
print("Entered context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type:
print(f"\tException raised. Type: {exc_type}")
if exc_val:
print(f"\tException raised. Value: {exc_val}")
if exc_tb:
print(f"\tException raised. Traceback: {exc_tb}")
print("\tExiting context")
# Returning True means that context manager will supress the exception and it will not be propagated outside
# the with block. IOW it indicated, that exception is going to be handled inside context
return True
# Returning False means that the exception will be propagated and it will be raised outside the with block
# IOW it means that the exception will not be handled inside context manager and must be handled by the caller
# Note from documentation: __exit__() methods should not reraise the passed-in exception;
# this is the callers responsibility.
# return False # Or return None
def main():
with ContextPlayground() as kek:
print(f"\t\t{kek.keka}")
print("\t\tInside context")
print("Outside context")
class AsyncContextPlayground:
"""Asyncio version of ContextPlayground"""
def __init__(self) -> None:
self.keka = "Hi, i am async Keka"
async def __aenter__(self):
print("\tEntered async context")
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
if exc_type:
print(f"\t\tException raised. Type: {exc_type}")
if exc_val:
print(f"\t\tException raised. Value: {exc_val}")
if exc_tb:
print(f"\t\tException raised. Traceback: {exc_tb}")
print("\tExiting async context")
return True
async def async_main():
async with AsyncContextPlayground() as kek:
print(f"\t\t{kek.keka}")
print("\t\tInside async context")
raise ValueError("An error occurred") # Uncomment to test exception handling
print("Outside async context")
if __name__ == "__main__":
asyncio.run(async_main())

View file

@ -5,14 +5,12 @@ description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"fastapi>=0.115.0",
"uvicorn[standard]>=0.32.0",
"pydantic>=2.11.7",
"pydantic-settings>=2.0.0",
"pytest>=8.3.4",
"sqlalchemy>=2.0.37",
"psycopg2-binary>=2.9.10",
"python-dotenv>=1.0.1",
"asyncpg>=0.30.0",
"grpcio>=1.70.0",
"grpcio-tools>=1.70.0",
]
[dependency-groups]

View file

@ -1,23 +0,0 @@
[tool.poetry]
name = "f1tness-parser"
version = "0.1.0"
description = ""
authors = ["pro100ton <pro100ton@gmail.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.10"
pydantic = "^2.10.5"
pytest = "^8.3.4"
sqlalchemy = "^2.0.37"
psycopg2 = "^2.9.10"
python-dotenv = "^1.0.1"
asyncpg = "^0.30.0"
grpcio = "^1.70.0"
grpcio-tools = "^1.70.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

14
run.py Normal file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python3
"""
Development server runner for the Fitness Parser API
"""
import uvicorn
if __name__ == "__main__":
uvicorn.run(
"app.main:app",
host="0.0.0.0",
port=8000,
reload=True,
log_level="info"
)

0
tests/__init__.py Normal file
View file

0
tests/conftest.py Normal file
View file

View file

View file

348
uv.lock
View file

@ -12,19 +12,28 @@ wheels = [
]
[[package]]
name = "asyncpg"
version = "0.30.0"
name = "anyio"
version = "4.10.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload-time = "2024-10-20T00:30:41.127Z" }
dependencies = [
{ name = "idna" },
{ name = "sniffio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload-time = "2024-10-20T00:29:55.165Z" },
{ url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload-time = "2024-10-20T00:29:57.14Z" },
{ url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload-time = "2024-10-20T00:29:58.499Z" },
{ url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload-time = "2024-10-20T00:30:00.354Z" },
{ url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload-time = "2024-10-20T00:30:02.794Z" },
{ url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload-time = "2024-10-20T00:30:04.501Z" },
{ url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload-time = "2024-10-20T00:30:06.537Z" },
{ url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload-time = "2024-10-20T00:30:09.024Z" },
{ url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
]
[[package]]
name = "click"
version = "8.2.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
]
[[package]]
@ -41,14 +50,12 @@ name = "f1tness-parser"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "asyncpg" },
{ name = "grpcio" },
{ name = "grpcio-tools" },
{ name = "psycopg2-binary" },
{ name = "fastapi" },
{ name = "pydantic" },
{ name = "pydantic-settings" },
{ name = "pytest" },
{ name = "python-dotenv" },
{ name = "sqlalchemy" },
{ name = "uvicorn", extra = ["standard"] },
]
[package.dev-dependencies]
@ -60,14 +67,12 @@ dev = [
[package.metadata]
requires-dist = [
{ name = "asyncpg", specifier = ">=0.30.0" },
{ name = "grpcio", specifier = ">=1.70.0" },
{ name = "grpcio-tools", specifier = ">=1.70.0" },
{ name = "psycopg2-binary", specifier = ">=2.9.10" },
{ name = "fastapi", specifier = ">=0.115.0" },
{ name = "pydantic", specifier = ">=2.11.7" },
{ name = "pydantic-settings", specifier = ">=2.0.0" },
{ name = "pytest", specifier = ">=8.3.4" },
{ name = "python-dotenv", specifier = ">=1.0.1" },
{ name = "sqlalchemy", specifier = ">=2.0.37" },
{ name = "uvicorn", extras = ["standard"], specifier = ">=0.32.0" },
]
[package.metadata.requires-dev]
@ -78,68 +83,50 @@ dev = [
]
[[package]]
name = "greenlet"
version = "3.2.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" },
{ url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" },
{ url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" },
{ url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" },
{ url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" },
{ url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" },
{ url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" },
{ url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" },
{ url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" },
{ url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" },
{ url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" },
{ url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" },
{ url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" },
{ url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" },
{ url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" },
{ url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" },
]
[[package]]
name = "grpcio"
version = "1.74.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/38/b4/35feb8f7cab7239c5b94bd2db71abb3d6adb5f335ad8f131abb6060840b6/grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", size = 12756048, upload-time = "2025-07-24T18:54:23.039Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d4/d8/1004a5f468715221450e66b051c839c2ce9a985aa3ee427422061fcbb6aa/grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", size = 5449488, upload-time = "2025-07-24T18:53:41.174Z" },
{ url = "https://files.pythonhosted.org/packages/94/0e/33731a03f63740d7743dced423846c831d8e6da808fcd02821a4416df7fa/grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", size = 10974059, upload-time = "2025-07-24T18:53:43.066Z" },
{ url = "https://files.pythonhosted.org/packages/0d/c6/3d2c14d87771a421205bdca991467cfe473ee4c6a1231c1ede5248c62ab8/grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", size = 5945647, upload-time = "2025-07-24T18:53:45.269Z" },
{ url = "https://files.pythonhosted.org/packages/c5/83/5a354c8aaff58594eef7fffebae41a0f8995a6258bbc6809b800c33d4c13/grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", size = 6626101, upload-time = "2025-07-24T18:53:47.015Z" },
{ url = "https://files.pythonhosted.org/packages/3f/ca/4fdc7bf59bf6994aa45cbd4ef1055cd65e2884de6113dbd49f75498ddb08/grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", size = 6182562, upload-time = "2025-07-24T18:53:48.967Z" },
{ url = "https://files.pythonhosted.org/packages/fd/48/2869e5b2c1922583686f7ae674937986807c2f676d08be70d0a541316270/grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", size = 6303425, upload-time = "2025-07-24T18:53:50.847Z" },
{ url = "https://files.pythonhosted.org/packages/a6/0e/bac93147b9a164f759497bc6913e74af1cb632c733c7af62c0336782bd38/grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", size = 6996533, upload-time = "2025-07-24T18:53:52.747Z" },
{ url = "https://files.pythonhosted.org/packages/84/35/9f6b2503c1fd86d068b46818bbd7329db26a87cdd8c01e0d1a9abea1104c/grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", size = 6491489, upload-time = "2025-07-24T18:53:55.06Z" },
{ url = "https://files.pythonhosted.org/packages/75/33/a04e99be2a82c4cbc4039eb3a76f6c3632932b9d5d295221389d10ac9ca7/grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", size = 3805811, upload-time = "2025-07-24T18:53:56.798Z" },
{ url = "https://files.pythonhosted.org/packages/34/80/de3eb55eb581815342d097214bed4c59e806b05f1b3110df03b2280d6dfd/grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", size = 4489214, upload-time = "2025-07-24T18:53:59.771Z" },
]
[[package]]
name = "grpcio-tools"
version = "1.74.0"
name = "fastapi"
version = "0.116.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "grpcio" },
{ name = "protobuf" },
{ name = "setuptools" },
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/90/c8/bca79cb8c14bb63027831039919c801db9f593c7504c09433934f5dff6a4/grpcio_tools-1.74.0.tar.gz", hash = "sha256:88ab9eb18b6ac1b4872add6b394073bd8d44eee7c32e4dc60a022e25ffaffb95", size = 5390007, upload-time = "2025-07-24T18:57:23.852Z" }
sdist = { url = "https://files.pythonhosted.org/packages/78/d7/6c8b3bfe33eeffa208183ec037fee0cce9f7f024089ab1c5d12ef04bd27c/fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143", size = 296485, upload-time = "2025-07-11T16:22:32.057Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2f/65/307a72cf4bfa553a25e284bd1f27b94a53816ac01ddf432c398117b91b2a/grpcio_tools-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e2e22460355adbd0f25fdd7ed8b9ae53afb3875b9d5f34cdf1cf12559418245e", size = 2545750, upload-time = "2025-07-24T18:56:46.386Z" },
{ url = "https://files.pythonhosted.org/packages/5b/8e/9b2217c15baadc7cfca3eba9f980e147452ca82f41767490f619edea3489/grpcio_tools-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:0cab5a2c6ae75b555fee8a1a9a9b575205171e1de392fe2d4139a29e67d8f5bb", size = 5838169, upload-time = "2025-07-24T18:56:48.057Z" },
{ url = "https://files.pythonhosted.org/packages/ea/42/a6a158b7e91c0a358cddf3f9088b004c2bfa42d1f96154b9b8eb17e16d73/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:9b18afca48b55832402a716ea4634ef2b68927a8a17ddf4038f51812299255c9", size = 2517140, upload-time = "2025-07-24T18:56:49.696Z" },
{ url = "https://files.pythonhosted.org/packages/05/db/d4576a07b2d1211822a070f76a99a9f4f4cb63496a02964ce77c88df8a28/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85f442a9e89e276bf89a0c9c76ea71647a927d967759333c1fa40300c27f7bd", size = 2905214, upload-time = "2025-07-24T18:56:51.768Z" },
{ url = "https://files.pythonhosted.org/packages/77/dc/3713e75751f862d8c84f823ba935d486c0aac0b6f789fa61fbde04ad5019/grpcio_tools-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051ce925b0b99ae2daf61b3cba19962b8655cc2a72758ce4081b89272206f5a3", size = 2656245, upload-time = "2025-07-24T18:56:53.877Z" },
{ url = "https://files.pythonhosted.org/packages/bd/e4/01f9e8e0401d8e11a70ae8aff6899eb8c16536f69a0a9ffb25873588721c/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:98c7b8eb0de6984cd7fa7335ce3383b3bb9a1559edc238c811df88008d5d3593", size = 3052327, upload-time = "2025-07-24T18:56:55.535Z" },
{ url = "https://files.pythonhosted.org/packages/28/c2/264b4e705375a834c9c7462847ae435c0be1644f03a705d3d7464af07bd5/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f8f7d17b7573b9a2a6b4183fa4a56a2ab17370c8d0541e1424cf0c9c6f863434", size = 3500706, upload-time = "2025-07-24T18:56:57.245Z" },
{ url = "https://files.pythonhosted.org/packages/ee/c0/cc034cec5871a1918e7888e8ce700e06fab5bbb328f998a2f2750cd603b5/grpcio_tools-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:db08b91ea0cd66dc4b1b929100e7aa84c9c10c51573c8282ec1ba05b41f887ef", size = 3125098, upload-time = "2025-07-24T18:56:59.02Z" },
{ url = "https://files.pythonhosted.org/packages/69/55/5792b681af82b3ff1e50ce0ccfbb6d52fc68a13932ed3da57e58d7dfb67b/grpcio_tools-1.74.0-cp313-cp313-win32.whl", hash = "sha256:4b6c5efb331ae9e5f614437f4a5938459a8a5a1ab3dfe133d2bbdeaba39b894d", size = 992431, upload-time = "2025-07-24T18:57:00.618Z" },
{ url = "https://files.pythonhosted.org/packages/94/9f/626f0fe6bfc1c6917785c6a5ee2eb8c07b5a30771e4bf4cff3c1ab5b431b/grpcio_tools-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8324cd67f61f7900d227b36913ee5f0302ba3ba8777c8bc705afa8174098d28", size = 1157064, upload-time = "2025-07-24T18:57:02.579Z" },
{ url = "https://files.pythonhosted.org/packages/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" },
]
[[package]]
name = "h11"
version = "0.16.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
]
[[package]]
name = "httptools"
version = "0.6.4"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" },
{ url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" },
{ url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" },
{ url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" },
{ url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" },
{ url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" },
{ url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" },
]
[[package]]
name = "idna"
version = "3.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
]
[[package]]
@ -213,39 +200,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]]
name = "protobuf"
version = "6.31.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/52/f3/b9655a711b32c19720253f6f06326faf90580834e2e83f840472d752bc8b/protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a", size = 441797, upload-time = "2025-05-28T19:25:54.947Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f3/6f/6ab8e4bf962fd5570d3deaa2d5c38f0a363f57b4501047b5ebeb83ab1125/protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9", size = 423603, upload-time = "2025-05-28T19:25:41.198Z" },
{ url = "https://files.pythonhosted.org/packages/44/3a/b15c4347dd4bf3a1b0ee882f384623e2063bb5cf9fa9d57990a4f7df2fb6/protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447", size = 435283, upload-time = "2025-05-28T19:25:44.275Z" },
{ url = "https://files.pythonhosted.org/packages/6a/c9/b9689a2a250264a84e66c46d8862ba788ee7a641cdca39bccf64f59284b7/protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402", size = 425604, upload-time = "2025-05-28T19:25:45.702Z" },
{ url = "https://files.pythonhosted.org/packages/76/a1/7a5a94032c83375e4fe7e7f56e3976ea6ac90c5e85fac8576409e25c39c3/protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39", size = 322115, upload-time = "2025-05-28T19:25:47.128Z" },
{ url = "https://files.pythonhosted.org/packages/fa/b1/b59d405d64d31999244643d88c45c8241c58f17cc887e73bcb90602327f8/protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6", size = 321070, upload-time = "2025-05-28T19:25:50.036Z" },
{ url = "https://files.pythonhosted.org/packages/f7/af/ab3c51ab7507a7325e98ffe691d9495ee3d3aa5f589afad65ec920d39821/protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e", size = 168724, upload-time = "2025-05-28T19:25:53.926Z" },
]
[[package]]
name = "psycopg2-binary"
version = "2.9.10"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" },
{ url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" },
{ url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" },
{ url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" },
{ url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" },
{ url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" },
{ url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" },
{ url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" },
{ url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" },
{ url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" },
{ url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" },
]
[[package]]
name = "pydantic"
version = "2.11.7"
@ -289,6 +243,20 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
]
[[package]]
name = "pydantic-settings"
version = "2.10.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "python-dotenv" },
{ name = "typing-inspection" },
]
sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
]
[[package]]
name = "pygments"
version = "2.19.2"
@ -324,33 +292,41 @@ wheels = [
]
[[package]]
name = "setuptools"
version = "80.9.0"
name = "pyyaml"
version = "6.0.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
{ url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
{ url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
{ url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
{ url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
{ url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
{ url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
{ url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
{ url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
]
[[package]]
name = "sqlalchemy"
version = "2.0.43"
name = "sniffio"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
]
[[package]]
name = "starlette"
version = "0.47.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" },
{ name = "typing-extensions" },
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d7/bc/d59b5d97d27229b0e009bd9098cd81af71c2fa5549c580a0a67b9bed0496/sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", size = 9762949, upload-time = "2025-08-11T14:24:58.438Z" }
sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144, upload-time = "2025-08-24T13:36:42.122Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", size = 2130598, upload-time = "2025-08-11T15:51:15.903Z" },
{ url = "https://files.pythonhosted.org/packages/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", size = 2118415, upload-time = "2025-08-11T15:51:17.256Z" },
{ url = "https://files.pythonhosted.org/packages/cf/ff/22ab2328148492c4d71899d62a0e65370ea66c877aea017a244a35733685/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", size = 3248707, upload-time = "2025-08-11T15:52:38.444Z" },
{ url = "https://files.pythonhosted.org/packages/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", size = 3253602, upload-time = "2025-08-11T15:56:37.348Z" },
{ url = "https://files.pythonhosted.org/packages/b8/61/987b6c23b12c56d2be451bc70900f67dd7d989d52b1ee64f239cf19aec69/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", size = 3183248, upload-time = "2025-08-11T15:52:39.865Z" },
{ url = "https://files.pythonhosted.org/packages/86/85/29d216002d4593c2ce1c0ec2cec46dda77bfbcd221e24caa6e85eff53d89/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", size = 3219363, upload-time = "2025-08-11T15:56:39.11Z" },
{ url = "https://files.pythonhosted.org/packages/b6/e4/bd78b01919c524f190b4905d47e7630bf4130b9f48fd971ae1c6225b6f6a/sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", size = 2096718, upload-time = "2025-08-11T15:55:05.349Z" },
{ url = "https://files.pythonhosted.org/packages/ac/a5/ca2f07a2a201f9497de1928f787926613db6307992fe5cda97624eb07c2f/sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", size = 2123200, upload-time = "2025-08-11T15:55:07.932Z" },
{ url = "https://files.pythonhosted.org/packages/b8/d9/13bdde6521f322861fab67473cec4b1cc8999f3871953531cf61945fad92/sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", size = 1924759, upload-time = "2025-08-11T15:39:53.024Z" },
{ url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" },
]
[[package]]
@ -391,3 +367,115 @@ sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7
wheels = [
{ url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
]
[[package]]
name = "uvicorn"
version = "0.35.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" },
]
[package.optional-dependencies]
standard = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "httptools" },
{ name = "python-dotenv" },
{ name = "pyyaml" },
{ name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" },
{ name = "watchfiles" },
{ name = "websockets" },
]
[[package]]
name = "uvloop"
version = "0.21.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" },
{ url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" },
{ url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" },
{ url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" },
{ url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" },
{ url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" },
]
[[package]]
name = "watchfiles"
version = "1.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" },
{ url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" },
{ url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" },
{ url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" },
{ url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" },
{ url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" },
{ url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" },
{ url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" },
{ url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" },
{ url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" },
{ url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" },
{ url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" },
{ url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" },
{ url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" },
{ url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" },
{ url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" },
{ url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" },
{ url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" },
{ url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" },
{ url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" },
{ url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" },
{ url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" },
{ url = "https://files.pythonhosted.org/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114, upload-time = "2025-06-15T19:06:06.186Z" },
{ url = "https://files.pythonhosted.org/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879, upload-time = "2025-06-15T19:06:07.369Z" },
{ url = "https://files.pythonhosted.org/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026, upload-time = "2025-06-15T19:06:08.476Z" },
{ url = "https://files.pythonhosted.org/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917, upload-time = "2025-06-15T19:06:09.988Z" },
{ url = "https://files.pythonhosted.org/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602, upload-time = "2025-06-15T19:06:11.088Z" },
{ url = "https://files.pythonhosted.org/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758, upload-time = "2025-06-15T19:06:12.197Z" },
{ url = "https://files.pythonhosted.org/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601, upload-time = "2025-06-15T19:06:13.391Z" },
{ url = "https://files.pythonhosted.org/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936, upload-time = "2025-06-15T19:06:14.656Z" },
{ url = "https://files.pythonhosted.org/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243, upload-time = "2025-06-15T19:06:16.232Z" },
{ url = "https://files.pythonhosted.org/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073, upload-time = "2025-06-15T19:06:17.457Z" },
{ url = "https://files.pythonhosted.org/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872, upload-time = "2025-06-15T19:06:18.57Z" },
{ url = "https://files.pythonhosted.org/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877, upload-time = "2025-06-15T19:06:19.55Z" },
{ url = "https://files.pythonhosted.org/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645, upload-time = "2025-06-15T19:06:20.66Z" },
{ url = "https://files.pythonhosted.org/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424, upload-time = "2025-06-15T19:06:21.712Z" },
{ url = "https://files.pythonhosted.org/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584, upload-time = "2025-06-15T19:06:22.777Z" },
{ url = "https://files.pythonhosted.org/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675, upload-time = "2025-06-15T19:06:24.226Z" },
{ url = "https://files.pythonhosted.org/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363, upload-time = "2025-06-15T19:06:25.42Z" },
{ url = "https://files.pythonhosted.org/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240, upload-time = "2025-06-15T19:06:26.552Z" },
{ url = "https://files.pythonhosted.org/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607, upload-time = "2025-06-15T19:06:27.606Z" },
{ url = "https://files.pythonhosted.org/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315, upload-time = "2025-06-15T19:06:29.076Z" },
]
[[package]]
name = "websockets"
version = "15.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" },
{ url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" },
{ url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" },
{ url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" },
{ url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" },
{ url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" },
{ url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" },
{ url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" },
{ url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" },
{ url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" },
{ url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" },
{ url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" },
]