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 date: date
exercises: Optional[List[Exercise]] exercises: Optional[List[Exercise]]
class Coach(BaseModel): class Coach(BaseModel):
name: str name: str

View file

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
from typing import List from typing import List
from apple.notes_parser import AppleNotesParser from app.core.parsers.apple import AppleNotesParser
from obsidian.notes_parser import ObsidianNotesParser from app.core.parsers.obsidian import ObsidianNotesParser
from obsidian.py_models import Training from app.core.models.training import Training
def parse_old_data() -> List[Training]: def parse_old_data() -> List[Training]:
"""Method for parsing all old data from apple and obsidian notes with exercise mapping applied """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: services:
database: fastapi-app:
image: 'postgres:latest' build:
context: .
dockerfile: Dockerfile
ports: ports:
- 5433:5432 - "8000:8000"
env_file: volumes:
- .env - ./app:/app/app:ro
- ./data:/app/data:ro
- ./tests:/app/tests:ro
environment: 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" readme = "README.md"
requires-python = ">=3.13" requires-python = ">=3.13"
dependencies = [ dependencies = [
"fastapi>=0.115.0",
"uvicorn[standard]>=0.32.0",
"pydantic>=2.11.7", "pydantic>=2.11.7",
"pydantic-settings>=2.0.0",
"pytest>=8.3.4", "pytest>=8.3.4",
"sqlalchemy>=2.0.37",
"psycopg2-binary>=2.9.10",
"python-dotenv>=1.0.1", "python-dotenv>=1.0.1",
"asyncpg>=0.30.0",
"grpcio>=1.70.0",
"grpcio-tools>=1.70.0",
] ]
[dependency-groups] [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]] [[package]]
name = "asyncpg" name = "anyio"
version = "0.30.0" version = "4.10.0"
source = { registry = "https://pypi.org/simple" } 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 = [ 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/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" },
{ 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" }, [[package]]
{ 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" }, name = "click"
{ 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" }, version = "8.2.1"
{ 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" }, source = { registry = "https://pypi.org/simple" }
{ 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" }, 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]] [[package]]
@ -41,14 +50,12 @@ name = "f1tness-parser"
version = "0.1.0" version = "0.1.0"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "asyncpg" }, { name = "fastapi" },
{ name = "grpcio" },
{ name = "grpcio-tools" },
{ name = "psycopg2-binary" },
{ name = "pydantic" }, { name = "pydantic" },
{ name = "pydantic-settings" },
{ name = "pytest" }, { name = "pytest" },
{ name = "python-dotenv" }, { name = "python-dotenv" },
{ name = "sqlalchemy" }, { name = "uvicorn", extra = ["standard"] },
] ]
[package.dev-dependencies] [package.dev-dependencies]
@ -60,14 +67,12 @@ dev = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "asyncpg", specifier = ">=0.30.0" }, { name = "fastapi", specifier = ">=0.115.0" },
{ name = "grpcio", specifier = ">=1.70.0" },
{ name = "grpcio-tools", specifier = ">=1.70.0" },
{ name = "psycopg2-binary", specifier = ">=2.9.10" },
{ name = "pydantic", specifier = ">=2.11.7" }, { name = "pydantic", specifier = ">=2.11.7" },
{ name = "pydantic-settings", specifier = ">=2.0.0" },
{ name = "pytest", specifier = ">=8.3.4" }, { name = "pytest", specifier = ">=8.3.4" },
{ name = "python-dotenv", specifier = ">=1.0.1" }, { 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] [package.metadata.requires-dev]
@ -78,68 +83,50 @@ dev = [
] ]
[[package]] [[package]]
name = "greenlet" name = "fastapi"
version = "3.2.4" version = "0.116.1"
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"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "grpcio" }, { name = "pydantic" },
{ name = "protobuf" }, { name = "starlette" },
{ name = "setuptools" }, { 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 = [ 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/e5/47/d63c60f59a59467fda0f93f46335c9d18526d7071f025cb5b89d5353ea42/fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565", size = 95631, upload-time = "2025-07-11T16:22:30.485Z" },
{ 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" }, [[package]]
{ 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" }, name = "h11"
{ 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" }, version = "0.16.0"
{ 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" }, source = { registry = "https://pypi.org/simple" }
{ 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" }, 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" }
{ 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" }, wheels = [
{ 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/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]] [[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" }, { 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]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.11.7" 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" }, { 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]] [[package]]
name = "pygments" name = "pygments"
version = "2.19.2" version = "2.19.2"
@ -324,33 +292,41 @@ wheels = [
] ]
[[package]] [[package]]
name = "setuptools" name = "pyyaml"
version = "80.9.0" version = "6.0.2"
source = { registry = "https://pypi.org/simple" } 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 = [ 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]] [[package]]
name = "sqlalchemy" name = "sniffio"
version = "2.0.43" 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" } source = { registry = "https://pypi.org/simple" }
dependencies = [ 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 = "anyio" },
{ name = "typing-extensions" },
] ]
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 = [ 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/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991, upload-time = "2025-08-24T13:36:40.887Z" },
{ 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" },
] ]
[[package]] [[package]]
@ -391,3 +367,115 @@ sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7
wheels = [ 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" }, { 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" },
]