Remove all python code

This commit is contained in:
pro100ton 2025-06-22 18:44:49 +03:00
parent 2cb868aecc
commit f3ecc5e238
43 changed files with 0 additions and 5018 deletions

165
.gitignore vendored
View file

@ -1,165 +0,0 @@
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
pyrightconfig.json

View file

@ -1,64 +0,0 @@
# f1tness_parser
Приложение для парсинга текстовых файлов тренировок
## Поддерживаемые записи
Работает с двумя категорями записей:
- Obsidian notes
- Apple notes
## Формат записей
Тренировки должны быть записаны в форматах:
### Obsisian notes
```
# 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 |
```
### Apple notes
```
**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|
||||
||||
**14.08.2024 (с121-67)**
```

View file

View file

@ -1,5 +0,0 @@
# Команда для генерации файлов
*Запускать надо из корня приложения*
```
python3 -m grpc_tools.protoc -Iapi/proto=api/proto --python_out=. --pyi_out=. --grpc_python_out=. api/proto/routes.proto
```

View file

View file

@ -1,14 +0,0 @@
syntax = "proto3";
service RouteApproaches {
rpc GetApproach(ApproachID) returns (Approach) {}
}
message ApproachID {
int32 approachID = 1;
}
message Approach {
int32 reps = 1;
double weight = 2;
}

View file

@ -1,40 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: api/proto/routes.proto
# Protobuf Python Version: 5.29.0
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
5,
29,
0,
'',
'api/proto/routes.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x61pi/proto/routes.proto\" \n\nApproachID\x12\x12\n\napproachID\x18\x01 \x01(\x05\"(\n\x08\x41pproach\x12\x0c\n\x04reps\x18\x01 \x01(\x05\x12\x0e\n\x06weight\x18\x02 \x01(\x01\x32:\n\x0fRouteApproaches\x12\'\n\x0bGetApproach\x12\x0b.ApproachID\x1a\t.Approach\"\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'api.proto.routes_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_APPROACHID']._serialized_start=26
_globals['_APPROACHID']._serialized_end=58
_globals['_APPROACH']._serialized_start=60
_globals['_APPROACH']._serialized_end=100
_globals['_ROUTEAPPROACHES']._serialized_start=102
_globals['_ROUTEAPPROACHES']._serialized_end=160
# @@protoc_insertion_point(module_scope)

View file

@ -1,19 +0,0 @@
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional
DESCRIPTOR: _descriptor.FileDescriptor
class ApproachID(_message.Message):
__slots__ = ("approachID",)
APPROACHID_FIELD_NUMBER: _ClassVar[int]
approachID: int
def __init__(self, approachID: _Optional[int] = ...) -> None: ...
class Approach(_message.Message):
__slots__ = ("reps", "weight")
REPS_FIELD_NUMBER: _ClassVar[int]
WEIGHT_FIELD_NUMBER: _ClassVar[int]
reps: int
weight: float
def __init__(self, reps: _Optional[int] = ..., weight: _Optional[float] = ...) -> None: ...

View file

@ -1,97 +0,0 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
from api.proto import routes_pb2 as api_dot_proto_dot_routes__pb2
GRPC_GENERATED_VERSION = '1.70.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ f' but the generated code in api/proto/routes_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)
class RouteApproachesStub(object):
"""Missing associated documentation comment in .proto file."""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.GetApproach = channel.unary_unary(
'/RouteApproaches/GetApproach',
request_serializer=api_dot_proto_dot_routes__pb2.ApproachID.SerializeToString,
response_deserializer=api_dot_proto_dot_routes__pb2.Approach.FromString,
_registered_method=True)
class RouteApproachesServicer(object):
"""Missing associated documentation comment in .proto file."""
def GetApproach(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_RouteApproachesServicer_to_server(servicer, server):
rpc_method_handlers = {
'GetApproach': grpc.unary_unary_rpc_method_handler(
servicer.GetApproach,
request_deserializer=api_dot_proto_dot_routes__pb2.ApproachID.FromString,
response_serializer=api_dot_proto_dot_routes__pb2.Approach.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'RouteApproaches', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
server.add_registered_method_handlers('RouteApproaches', rpc_method_handlers)
# This class is part of an EXPERIMENTAL API.
class RouteApproaches(object):
"""Missing associated documentation comment in .proto file."""
@staticmethod
def GetApproach(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/RouteApproaches/GetApproach',
api_dot_proto_dot_routes__pb2.ApproachID.SerializeToString,
api_dot_proto_dot_routes__pb2.Approach.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

View file

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 |

View file

@ -1,572 +0,0 @@
unique_apple_exercises_mapper = {
"Батерфляй": "Баттерфляй",
"Баттерфляй": "Баттерфляй",
"Баттерфляй дю": "Баттерфляй",
"Бицепс на лавке 45⁰": "Подъем гантелей на бицепс сидя",
"Болгарский присед": "Болгарские сплит-приседения",
"Брусья": "Брусья",
"Брусья (гравитрон)": "Брусья",
"Брусья в тренажере": "Брусья",
"Брусья прямые ноги": "Брусья",
"Брусья узким хватом": "Брусья",
"Брусья узким хватом за": "Брусья",
"Брусья широким хватом": "Брусья",
"Брусья-прямые ноги": "Брусья",
"ГАК машина": "Жим ногами (гакк-машина)",
"Гакк машина": "Жим ногами (гакк-машина)",
"Гакк присед": "Жим ногами (гакк-машина)",
"Гантели": "Подъем гантелей на бицепс стоя",
"Гантели к поясу лежа на скамье": "Тяга гантелей на скамье",
"Гантели молот": "Гантели молот",
"Гантели на лавках": "Жим гантелей сидя",
"Гантели-молот": "Гантели молот",
"Гипекстензия": "Гиперэкстензия",
"Гиперэкстензия": "Гиперэкстензия",
"Горизонтальна тяга на себя": "Тяга горизонтального блока",
"Горизонтальная тяга блока": "Тяга горизонтального блока",
"Гравитрон": "Гравитрон",
"Гравитрор": "Гравитрон",
"Гребная тяга": "Гребная тяга с упором в грудь",
"Гребная тяга с упором в грудь": "Гребная тяга с упором в грудь",
"Гребная тяга с упором в грудь как": "Гребная тяга с упором в грудь",
"Гребная тяга с упором на грудь": "Гребная тяга с упором в грудь",
"Гребная тяга сидя (одна рука)": "Гребная тяга с упором в грудь (по очереди)",
"Гребная тяга сидя одной рукой": "Гребная тяга с упором в грудь (по очереди)",
"Гребная тяга сидя с упором в грудт": "Гребная тяга с упором в грудь",
"Гребная тяга сидя с упором в грудь": "Гребная тяга с упором в грудь",
"Гребная тяга сидя с упором в грудь (одной рукой рычаг)": "Гребная тяга с упором в грудь (по очереди)",
"Гребная тяга\xa0 упором в грудьс": "Гребная тяга с упором в грудь",
"Жим в тренажере вверх": "Жим от плеч вверх в тренажере (рычаги)",
"Жим в тренажере на плечи блочный (3х12)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим в тренажёре на плечи (силовой тренажёр: жим сидя)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим вверх 80⁰": "Жим гантелей сидя",
"Жим гантелей": "Жим гантелей лежа",
"Жим гантелей 45⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей 60⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей 80⁰": "Жим гантелей сидя",
"Жим гантелей 90⁰": "Жим гантелей сидя",
"Жим гантелей вверх 80⁰": "Жим гантелей сидя",
"Жим гантелей вверх 90⁰": "Жим гантелей сидя",
"Жим гантелей вверх сидя 90⁰": "Жим гантелей сидя",
"Жим гантелей лежа": "Жим гантелей лежа",
"Жим гантелей лежа 15⁰": "Жим гантелей лежа",
"Жим гантелей лежа 30⁰": "Жим гантелей лежа",
"Жим гантелей лежа на скамье": "Жим гантелей лежа",
"Жим гантелей лёжа": "Жим гантелей лежа",
"Жим гантелей лёжа на скамье": "Жим гантелей лежа",
"Жим гантелей на скамье": "Жим гантелей лежа",
"Жим гантелей на скамье 45⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей сидя": "Жим гантелей сидя",
"Жим гантелей сидя 80⁰": "Жим гантелей сидя",
"Жим гантелей сидя 90⁰": "Жим гантелей сидя",
"Жим гантелей сидя на скамейке": "Жим гантелей сидя",
"Жим гантелей стоя": "Подъем гантелей на бицепс стоя",
"Жим л груди в тренажёре": "Жим от груди сидя в тренажере (рычаги)",
"Жим лежа": "Жим штанги лежа",
"Жим ногами": "Жим ногами",
"Жим ногами (3х15)": "Жим ногами",
"Жим ногами (медленно вниз)": "Жим ногами",
"Жим ногами лежа": "Жим ногами",
"Жим ногами медленно": "Жим ногами",
"Жим от груди": "Жим штанги лежа",
"Жим от груди (сидя, тренажёр)": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди в тренажере сидя": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди в тренажёре (кирпичики)": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя (блинчики)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя в тренажере": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя в тренажере (около трицепс машины)": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя в тренажере (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя в тренажере рычаги": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя в тренажёре": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя в тренажёре (блинчики)": "Жим от груди сидя в тренажере (блоки)",
"Жим от груди сидя в тренажёре (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от плеч (рычаги)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх в тренажёре": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх сидя": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх сидя 80⁰": "Жим гантелей сидя",
"Жим от плеч вверх сидя в тренажере": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя (рычаги)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя зэ": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя хз": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плечей вверх": "Жим от плеч вверх в тренажере (рычаги)",
"Жим плечами вверх сидя": "Жим от плеч вверх в тренажере (рычаги)",
"Жим сидя 45⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим штанги 45⁰": "Жим штанги сидя (45 градусов)",
"Жим штанги в наклоне": "Тяга штанги в наклоне",
"Жим штанги лежа": "Жим штанги лежа",
"Жим штанги сидя 45⁰": "Жим штанги сидя (45 градусов)",
"Жим штанги стля": "Подъем штанги на бицепс стоя",
"Жим штанги стоя": "Подъем штанги на бицепс стоя",
"Жис гантелей лежа": "Жим гантелей лежа",
"Жис сидя в тренажёре": "Жим от груди сидя в тренажере (рычаги)",
"Махи в наклоне с упором": "Разведение рук в стороны в наклоне (гантели)",
"Молот назад двумя руками": "Гантели молот",
"Молот трицепс стоя": "Гантели молот",
"Молоты": "Гантели молот",
"Наклонная тяга (скамья)": "Жим штанги лежа",
"Наклоны с прямой спиной": "Наклоны с прямой спиной",
"Отведение в кроссовере одной рукой": "Отведение рук в кроссовере (по очереди)",
"Отведение в рук в наклоне": "Разведение рук в стороны в наклоне (гантели)",
"Отведение назад в пек дек": "Разведение рук в пек-дек",
"Отведение назад в тренажере пек дек": "Разведение рук в пек-дек",
"Отведение назад в тренажере пэк дэк (3х12)": "Разведение рук в пек-дек",
"Отведение рук в кроссовере": "Отведение рук в кроссовере (по очереди)",
"Отведение рук в стороны с гантелями стоя": "Разведение рук в стороны стоя (гантели)",
"Отведение рук в стороны стоя с гантелями": "Разведение рук в стороны стоя (гантели)",
"Отведение рук назад в пек дек": "Разведение рук в пек-дек",
"Отведение рук с гантелями стоя": "Разведение рук в стороны стоя (гантели)",
"Отведение рук стоя с гантелями": "Разведение рук в стороны стоя (гантели)",
"Отведение руки в кроссовере": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовере (одной рукой)": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовере (по одной руке)": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовере на каждую руку": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовкре": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в сторону": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в сторону в кроссовере (каждая рука)": "Отведение рук в кроссовере (по очереди)",
"Отведение руки стоя": "Отведение рук в кроссовере (по очереди)",
"Отведение руки стоя снизу вверх": "Отведение рук в кроссовере (по очереди)",
"Отжимания": "Отжимания",
"Отжимания на брусьях": "Брусья",
"Отжимания на брусьях узким хватом": "Брусья",
"Отжимания на брусьях широким хватом": "Брусья",
"Пек дек (отведение назад)": "Разведение рук в пек-дек",
"Пек дек разведение рук в стороны": "Разведение рук в пек-дек",
"Подтягивание на заднюю дельту в петлях": "Подтягивания",
"Подтягивание ног на ручнике": "Подъем ног на турнике",
"Подтягивание ног на турнике": "Подъем ног на турнике",
"Подтягивание ног прямых вися на турнике": "Подъем ног на турнике",
"Подтягивания": "Подтягивания",
"Подтягивания в гравитроне": "Подтягивания",
"Подтягивания на резинке": "Подтягивания",
"Подтягивания обратным хватом": "Подтягивания обратным хватом",
"Подтяотвания": "Подтягивания",
"Подъем коленей на турнике": "Подъем ног на турнике",
"Подъем ног на турнике": "Подъем ног на турнике",
"Подъем штанги стоя": "Подъем штанги на бицепс стоя",
"Подъёмы ног на турнике": "Подъем ног на турнике",
"Подьем штанги стоя": "Подъем штанги на бицепс стоя",
"Присд на одну ногу (по очереди)": "Выпады",
"Присед на одну ногу": "Выпады",
"Присед на одну ногу (каждая)": "Выпады",
"Приседания": "Приседания",
"Приседания на одной ноге": "Выпады",
"Разведение рук в кроссовере на трицепс": "Отжимание на трицепс в кроссовере",
"Разведение рук в наклоне": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в налоне": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в пек дек": "Разведение рук в пек-дек",
"Разведение рук в стороны": "Разведение рук в пек-дек",
"Разведение рук в стороны (дельт-машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны (дельта-машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны (пек дек)": "Разведение рук в пек-дек",
"Разведение рук в стороны в наклоне 90⁰": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в стороны в наклоне с гантелями": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в стороны в пекдек": "Разведение рук в пек-дек",
"Разведение рук в стороны в тренажёре": "Разведение рук в пек-дек",
"Разведение рук в стороны в тренажёре Дж": "Разведение рук в пек-дек",
"Разведение рук в стороны пек дек": "Разведение рук в пек-дек",
"Разведение рук в стороны с гантелям": "Разведение рук в стороны стоя (гантели)",
"Разведение рук в стороны стоя": "Разведение рук в стороны стоя (гантели)",
"Разведение рук в стороны стоя с гантелями": "Разведение рук в стороны стоя (гантели)",
"Разведение рук в стрроны": "Разведение рук в стороны стоя (гантели)",
"Разведение рук назад в пек дек": "Разведение рук в пек-дек",
"Разведение рук назад пек дек": "Разведение рук в пек-дек",
"Разведение рук пек дек": "Разведение рук в пек-дек",
"Разведение рук сидя": "Разведение рук в пек-дек",
"Разведение рук сидя с прямыми руками в тренажере": "Разведение рук в пек-дек",
"Разведение рук стоя с гантелями": "Разведение рук в стороны стоя (гантели)",
"Разгибание из за головы": "Гантели молот",
"Разгибание кик-бек": "Разгибание рук в наклоне (кик-бек)",
"Разгибание локтей в наклоне": "Разведение рук в стороны в наклоне (гантели)",
"Разгибание ног": "Разгибание ног сидя",
"Разгибание ног сидя": "Разгибание ног сидя",
"Разгибание ног сидя (4х10)": "Разгибание ног сидя",
"Разгибание прямых рук сидя": "Разведение рук в стороны (дельт-машина)",
"Разгибание рук в кроссовере": "Отжимание на трицепс в кроссовере",
"Разгибание рук в тренажёре для трицепса": "Отжимание на трицепс в кроссовере",
"Разгибание рук в трицепс машине (3х10)": "Отжимание на трицепс в кроссовере",
"Разгибание рук сидя": "Разгибание рук сидя (трицепс машина)",
"Разгибание рук сидя (локти в стороны)": "Разгибание рук сидя (трицепс машина)",
"Разгибание рук сидя (трицепс машина)": "Разгибание рук сидя (трицепс машина)",
"Разгибание рук стоя с канатом": "Отжимание на трицепс в кроссовере",
"Разгибание спины": "Разгибание спины",
"Румынская тяга": "Румынская тяга",
"Румынская тяга с гантелями": "Румынская тяга",
"Румынская тяна": "Румынская тяга",
"Румынская тяоа": "Румынская тяга",
"Сведение на скамейке":"Разведение рук в стороны в наклоне (гантели)",
"Сведение рук в пек дек": "Сведение рук в пек-дек",
"Сведение рук в пек дек зэ": "Сведение рук в пек-дек",
"Сведение рук в тренажере": "Сведение рук в пек-дек",
"Сведение рук в тренажёре пёк дек": "Сведение рук в пек-дек",
"Сведение рук пек дек": "Сведение рук в пек-дек",
"Сведение рук пек дек (бабочка)": "Сведение рук в пек-дек",
"Сведение рук сидя": "Сведение рук в пек-дек",
"Сведение рук сидя пек дек": "Сведение рук в пек-дек",
"Сведения рук пек дек": "Сведение рук в пек-дек",
"Сгибание гантелей в стиле молот одновременно": "Гантели молот",
"Сгибание ног": "Сгибание ног сидя",
"Сгибание ног лежа": "Сгибание ног лежа",
"Сгибание ног лежа (медленно разгибать)": "Сгибание ног лежа",
"Сгибание ног лёжа": "Сгибание ног лежа",
"Сгибание ног сидя": "Сгибание ног сидя",
"Сгибание ног сидя (3х12)": "Сгибание ног сидя",
"Сгибание рук с гантелями стоя": "Подъем гантелей на бицепс стоя",
"Сгибание рук с гантелями стоя ям": "Подъем гантелей на бицепс стоя",
"Сгибание со штангой стоя (3х12)": "Подъем штанги на бицепс стоя",
"Сгибания ног лежа": "Сгибание ног лежа",
"Сгибания рук со штангой стоя": "Подъем штанги на бицепс стоя",
"Силовой тренажер": "Жим от груди сидя в тренажере (блоки)",
"Скручивания на мяче": "Скручивания",
"Трацепс": "Отжимание на трицепс в кроссовере",
"Трицепс вниз у стойки": "Отжимание на трицепс в кроссовере",
"Трицепс машина": "Разгибание рук сидя (трицепс машина)",
"Трицепс сидя": "Разгибание рук сидя (трицепс машина)",
"Трицепс-машина (разгибание рук сидя)": "Разгибание рук сидя (трицепс машина)",
"Тяга Т гриф": "Тяга Т-грифа",
"Тяга в наклоне": "Тяга штанги в наклоне",
"Тяга вертикального блока": "Тяга вертикального блока",
"Тяга вертикального блока обратным хватом": "Тяга вертикального блока (обратный хват)",
"Тяга верхнего блока": "Тяга вертикального блока",
"Тяга верхнего блока обратным хватом": "Тяга вертикального блока (обратный хват)",
"Тяга вниз обратным хватом сидя (фитнес станция)": "Тяга вертикального блока (обратный хват)",
"Тяга вниз сидя": "Тяга вертикального блока",
"Тяга гантелей в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантелей к поясу лёжа на скамейке 40⁰": "Тяга гантелей на скамье",
"Тяга гантелей к поясу стоя в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантелей лежа на животе на скамье 80°": "Тяга гантелей на скамье",
"Тяга гантели в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне (гантеля поочередно)": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне (к поясу одной рукой)": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне одной рукой": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к корпусу в наклоне же": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к поясу": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к поясу в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к поясу в наклоне одной рукой": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к поясу в стойке": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели к поясу одной рукой у стойки": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели одной рукой в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели одной рукой в стойке": "Тяга гантелей в наклоне (по очереди)",
"Тяга горизонтально блока": "Тяга горизонтального блока",
"Тяга горизонтального блок": "Тяга горизонтального блока",
"Тяга горизонтального блока": "Тяга горизонтального блока",
"Тяга горизонтального блока (1 рука)": "Тяга горизонтального блока (по очереди)",
"Тяга горизонтального блока дю": "Тяга горизонтального блока",
"Тяга горизонтального блока одной рукой": "Тяга горизонтального блока (по очереди)",
"Тяга горизонтального блока одной рукой (поочерёдно)": "Тяга горизонтального блока (по очереди)",
"Тяга горизонтального блокай": "Тяга горизонтального блока",
"Тяга на себя": "Тяга горизонтального блока",
"Тяга на себя с упором в грудь": "Гребная тяга с упором в грудь",
"Тяга на себя сидя": "Тяга горизонтального блока",
"Тяга ногами": "Жим ногами",
"Тяга ногами вниз": "Жим ногами",
"Тяга обратным хватом штанги к поясу": "Тяга штанги в наклоне",
"Тяга одной рукой в кроссовере": "Тяга горизонтального блока (по очереди)",
"Тяга одной рукой в кроссовере на колене": "Тяга горизонтального блока (по очереди)",
"Тяга руки в кроссовере до": "Тяга горизонтального блока (по очереди)",
"Тяга рычага к груди": "Тяга горизонтального блока (по очереди)",
"Тяга сидя вниз обратным хватом": "Тяга вертикального блока (обратный хват)",
"Тяга т грифа": "Тяга Т-грифа",
"Тяга штанги в наклоне": "Тяга штанги в наклоне",
"Тяга штанги в наклоне к груди": "Тяга штанги в наклоне",
"Тяга штанги в наклоне к поясу": "Тяга штанги в наклоне",
"Тяга штанги в наклоне к поясу обратным хватом": "Тяга штанги в наклоне (обратным хватом)",
"Тяга штанги в наклоне обратным хватом": "Тяга штанги в наклоне (обратным хватом)",
"Тяга штанги к поясу в наклоне": "Тяга штанги в наклоне (обратным хватом)",
"Тяга штанги к поясу стоя": "Подъем штанги на бицепс стоя",
"Тяга штанги стоя": "Подъем штанги на бицепс стоя",
"Штанга": "Жим штанги лежа",
"Штанга в наклоне": "Тяга штанги в наклоне",
"Штанга лежа": "Жим штанги лежа",
"Штанга стоя": "Подъем штанги на бицепс стоя",
"тяга горизонтального блока": "Тяга горизонтального блока",
}
backup = {
"Батерфляй": 1,
"Баттерфляй": 16,
"Баттерфляй дю": 1,
"Бицепс на лавке 45⁰": 1,
"Болгарский присед": 1,
"Брусья": 1,
"Брусья (гравитрон)": 1,
"Брусья в тренажере": 1,
"Брусья прямые ноги": 1,
"Брусья узким хватом": 1,
"Брусья узким хватом за": 1,
"Брусья широким хватом": 3,
"Брусья-прямые ноги": 1,
"ГАК машина": 1,
"Гакк машина": 3,
"Гакк присед": 2,
"Гантели": 1,
"Гантели к поясу лежа на скамье": 1,
"Гантели молот": 1,
"Гантели на лавках": 1,
"Гантели-молот": 1,
"Гипекстензия": 1,
"Гиперэкстензия": 13,
"Горизонтальна тяга на себя": 1,
"Горизонтальная тяга блока": 1,
"Гравитрон": 30,
"Гравитрор": 1,
"Гребная тяга": 2,
"Гребная тяга с упором в грудь": 7,
"Гребная тяга с упором в грудь как": 1,
"Гребная тяга с упором на грудь": 5,
"Гребная тяга сидя (одна рука)": 1,
"Гребная тяга сидя одной рукой": 1,
"Гребная тяга сидя с упором в грудт": 1,
"Гребная тяга сидя с упором в грудь": 1,
"Гребная тяга сидя с упором в грудь (одной рукой рычаг)": 1,
"Гребная тяга\xa0 упором в грудьс": 1,
"Жим в тренажере вверх": 1,
"Жим в тренажере на плечи блочный (3х12)": 1,
"Жим в тренажёре на плечи (силовой тренажёр: жим сидя)": 1,
"Жим вверх 80⁰": 1,
"Жим гантелей": 3,
"Жим гантелей 45⁰": 3,
"Жим гантелей 60⁰": 1,
"Жим гантелей 80⁰": 3,
"Жим гантелей 90⁰": 3,
"Жим гантелей вверх 80⁰": 1,
"Жим гантелей вверх 90⁰": 1,
"Жим гантелей вверх сидя 90⁰": 1,
"Жим гантелей лежа": 10,
"Жим гантелей лежа 15⁰": 1,
"Жим гантелей лежа 30⁰": 1,
"Жим гантелей лежа на скамье": 1,
"Жим гантелей лёжа": 3,
"Жим гантелей лёжа на скамье": 2,
"Жим гантелей на скамье": 1,
"Жим гантелей на скамье 45⁰": 1,
"Жим гантелей сидя": 3,
"Жим гантелей сидя 80⁰": 2,
"Жим гантелей сидя 90⁰": 2,
"Жим гантелей сидя на скамейке": 1,
"Жим гантелей стоя": 2,
"Жим л груди в тренажёре": 1,
"Жим лежа": 6,
"Жим ногами": 15,
"Жим ногами (3х15)": 1,
"Жим ногами (медленно вниз)": 1,
"Жим ногами лежа": 1,
"Жим ногами медленно": 1,
"Жим от груди": 2,
"Жим от груди (сидя, тренажёр)": 1,
"Жим от груди в тренажере сидя": 1,
"Жим от груди в тренажёре (кирпичики)": 1,
"Жим от груди сидя": 5,
"Жим от груди сидя (блинчики)": 2,
"Жим от груди сидя в тренажере": 3,
"Жим от груди сидя в тренажере (около трицепс машины)": 1,
"Жим от груди сидя в тренажере (рычаги)": 1,
"Жим от груди сидя в тренажере рычаги": 1,
"Жим от груди сидя в тренажёре": 3,
"Жим от груди сидя в тренажёре (блинчики)": 1,
"Жим от груди сидя в тренажёре (рычаги)": 1,
"Жим от плеч (рычаги)": 1,
"Жим от плеч вверх": 12,
"Жим от плеч вверх в тренажёре": 1,
"Жим от плеч вверх сидя": 1,
"Жим от плеч вверх сидя 80⁰": 1,
"Жим от плеч вверх сидя в тренажере": 1,
"Жим от плеч сидя": 2,
"Жим от плеч сидя (рычаги)": 3,
"Жим от плеч сидя зэ": 1,
"Жим от плеч сидя хз": 1,
"Жим от плечей вверх": 1,
"Жим плечами вверх сидя": 1,
"Жим сидя 45⁰": 1,
"Жим штанги 45⁰": 2,
"Жим штанги в наклоне": 1,
"Жим штанги лежа": 1,
"Жим штанги сидя 45⁰": 1,
"Жим штанги стля": 1,
"Жим штанги стоя": 1,
"Жис гантелей лежа": 1,
"Жис сидя в тренажёре": 1,
"Махи в наклоне с упором": 1,
"Молот назад двумя руками": 1,
"Молот трицепс стоя": 1,
"Молоты": 1,
"Наклонная тяга (скамья)": 1,
"Наклоны с прямой спиной": 1,
"Отведение в кроссовере одной рукой": 1,
"Отведение в рук в наклоне": 1,
"Отведение назад в пек дек": 1,
"Отведение назад в тренажере пек дек": 1,
"Отведение назад в тренажере пэк дэк (3х12)": 1,
"Отведение рук в кроссовере": 1,
"Отведение рук в стороны с гантелями стоя": 1,
"Отведение рук в стороны стоя с гантелями": 1,
"Отведение рук назад в пек дек": 1,
"Отведение рук с гантелями стоя": 2,
"Отведение рук стоя с гантелями": 1,
"Отведение руки в кроссовере": 2,
"Отведение руки в кроссовере (одной рукой)": 1,
"Отведение руки в кроссовере (по одной руке)": 2,
"Отведение руки в кроссовере на каждую руку": 1,
"Отведение руки в кроссовкре": 1,
"Отведение руки в сторону": 1,
"Отведение руки в сторону в кроссовере (каждая рука)": 1,
"Отведение руки стоя": 2,
"Отведение руки стоя снизу вверх": 1,
"Отжимания": 16,
"Отжимания на брусьях": 7,
"Отжимания на брусьях узким хватом": 1,
"Отжимания на брусьях широким хватом": 3,
"Пек дек (отведение назад)": 1,
"Пек дек разведение рук в стороны": 1,
"Подтягивание на заднюю дельту в петлях": 1,
"Подтягивание ног на ручнике": 1,
"Подтягивание ног на турнике": 2,
"Подтягивание ног прямых вися на турнике": 1,
"Подтягивания": 8,
"Подтягивания в гравитроне": 1,
"Подтягивания на резинке": 1,
"Подтягивания обратным хватом": 8,
"Подтяотвания": 1,
"Подъем коленей на турнике": 1,
"Подъем ног на турнике": 4,
"Подъем штанги стоя": 2,
"Подъёмы ног на турнике": 1,
"Подьем штанги стоя": 1,
"Присд на одну ногу (по очереди)": 1,
"Присед на одну ногу": 1,
"Присед на одну ногу (каждая)": 1,
"Приседания": 16,
"Приседания на одной ноге": 1,
"Разведение рук в кроссовере на трицепс": 1,
"Разведение рук в наклоне": 2,
"Разведение рук в налоне": 1,
"Разведение рук в пек дек": 6,
"Разведение рук в стороны": 14,
"Разведение рук в стороны (дельт-машина)": 3,
"Разведение рук в стороны (дельта-машина)": 1,
"Разведение рук в стороны (пек дек)": 1,
"Разведение рук в стороны в наклоне 90⁰": 2,
"Разведение рук в стороны в наклоне с гантелями": 1,
"Разведение рук в стороны в пекдек": 1,
"Разведение рук в стороны в тренажёре": 1,
"Разведение рук в стороны в тренажёре Дж": 1,
"Разведение рук в стороны пек дек": 2,
"Разведение рук в стороны с гантелям": 1,
"Разведение рук в стороны стоя": 2,
"Разведение рук в стороны стоя с гантелями": 2,
"Разведение рук в стрроны": 1,
"Разведение рук назад в пек дек": 1,
"Разведение рук назад пек дек": 1,
"Разведение рук пек дек": 4,
"Разведение рук сидя": 3,
"Разведение рук сидя с прямыми руками в тренажере": 1,
"Разведение рук стоя с гантелями": 1,
"Разгибание из за головы": 1,
"Разгибание кик-бек": 1,
"Разгибание локтей в наклоне": 1,
"Разгибание ног": 5,
"Разгибание ног сидя": 22,
"Разгибание ног сидя (4х10)": 1,
"Разгибание прямых рук сидя": 1,
"Разгибание рук в кроссовере": 1,
"Разгибание рук в тренажёре для трицепса": 1,
"Разгибание рук в трицепс машине (3х10)": 1,
"Разгибание рук сидя": 5,
"Разгибание рук сидя (локти в стороны)": 1,
"Разгибание рук сидя (трицепс машина)": 1,
"Разгибание рук стоя с канатом": 1,
"Разгибание спины": 1,
"Румынская тяга": 5,
"Румынская тяга с гантелями": 1,
"Румынская тяна": 2,
"Румынская тяоа": 1,
"Сведение на скамейке": 1,
"Сведение рук в пек дек": 8,
"Сведение рук в пек дек зэ": 1,
"Сведение рук в тренажере": 1,
"Сведение рук в тренажёре пёк дек": 1,
"Сведение рук пек дек": 7,
"Сведение рук пек дек (бабочка)": 1,
"Сведение рук сидя": 3,
"Сведение рук сидя пек дек": 1,
"Сведения рук пек дек": 1,
"Сгибание гантелей в стиле молот одновременно": 1,
"Сгибание ног": 2,
"Сгибание ног лежа": 14,
"Сгибание ног лежа (медленно разгибать)": 1,
"Сгибание ног лёжа": 2,
"Сгибание ног сидя": 8,
"Сгибание ног сидя (3х12)": 1,
"Сгибание рук с гантелями стоя": 1,
"Сгибание рук с гантелями стоя ям": 1,
"Сгибание со штангой стоя (3х12)": 1,
"Сгибания ног лежа": 1,
"Сгибания рук со штангой стоя": 1,
"Силовой тренажер": 1,
"Скручивания на мяче": 2,
"Трацепс": 1,
"Трицепс вниз у стойки": 1,
"Трицепс машина": 4,
"Трицепс сидя": 1,
"Трицепс-машина (разгибание рук сидя)": 1,
"Тяга Т гриф": 1,
"Тяга в наклоне": 1,
"Тяга вертикального блока": 15,
"Тяга вертикального блока обратным хватом": 5,
"Тяга верхнего блока": 3,
"Тяга верхнего блока обратным хватом": 1,
"Тяга вниз обратным хватом сидя (фитнес станция)": 1,
"Тяга вниз сидя": 2,
"Тяга гантелей в наклоне": 3,
"Тяга гантелей к поясу лёжа на скамейке 40⁰": 1,
"Тяга гантелей к поясу стоя в наклоне": 1,
"Тяга гантелей лежа на животе на скамье 80°": 1,
"Тяга гантели в наклоне": 4,
"Тяга гантели в наклоне (гантеля поочередно)": 1,
"Тяга гантели в наклоне (к поясу одной рукой)": 1,
"Тяга гантели в наклоне одной рукой": 1,
"Тяга гантели к корпусу в наклоне же": 1,
"Тяга гантели к поясу": 1,
"Тяга гантели к поясу в наклоне": 1,
"Тяга гантели к поясу в наклоне одной рукой": 1,
"Тяга гантели к поясу в стойке": 1,
"Тяга гантели к поясу одной рукой у стойки": 1,
"Тяга гантели одной рукой в наклоне": 1,
"Тяга гантели одной рукой в стойке": 1,
"Тяга горизонтально блока": 1,
"Тяга горизонтального блок": 1,
"Тяга горизонтального блока": 14,
"Тяга горизонтального блока (1 рука)": 1,
"Тяга горизонтального блока дю": 1,
"Тяга горизонтального блока одной рукой": 4,
"Тяга горизонтального блока одной рукой (поочерёдно)": 1,
"Тяга горизонтального блокай": 1,
"Тяга на себя": 3,
"Тяга на себя с упором в грудь": 1,
"Тяга на себя сидя": 3,
"Тяга ногами": 1,
"Тяга ногами вниз": 1,
"Тяга обратным хватом штанги к поясу": 1,
"Тяга одной рукой в кроссовере": 1,
"Тяга одной рукой в кроссовере на колене": 1,
"Тяга руки в кроссовере до": 1,
"Тяга рычага к груди": 1,
"Тяга сидя вниз обратным хватом": 1,
"Тяга т грифа": 1,
"Тяга штанги в наклоне": 7,
"Тяга штанги в наклоне к груди": 1,
"Тяга штанги в наклоне к поясу": 1,
"Тяга штанги в наклоне к поясу обратным хватом": 1,
"Тяга штанги в наклоне обратным хватом": 1,
"Тяга штанги к поясу в наклоне": 1,
"Тяга штанги к поясу стоя": 1,
"Тяга штанги стоя": 1,
"Штанга": 2,
"Штанга в наклоне": 1,
"Штанга лежа": 1,
"Штанга стоя": 1,
"тяга горизонтального блока": 1,
}

View file

@ -1,144 +0,0 @@
import os
import re
from typing import List, Tuple
from datetime import datetime
from obsidian.py_models import Approach, Exercise, Training
from apple.mapper import unique_apple_exercises_mapper
current_directory = os.path.dirname(os.path.abspath(__file__))
def get_current_path():
return current_directory
def get_obsidian_examples_file(example_file_name: str):
return os.path.join(get_current_path(), f"examples/{example_file_name}")
def read_example_file(example_file_name: str):
path_to_example: str = get_obsidian_examples_file(example_file_name)
with open(path_to_example, "r") as f:
content = f.read()
return content
def filter_training_data(training_data: str):
cleaned_text = re.sub(
r"^\|(\s+|-*|\s-*\s)\|(\s+|-*|\s-*\s)\|(\s+|-*|\s-*\s)\|$",
"",
training_data,
flags=re.MULTILINE,
)
cleaned_text = re.sub(r"^\n", "", cleaned_text, flags=re.MULTILINE)
lines = cleaned_text.splitlines()
redundant_lines = [
"| | | |",
"|---|---|---|",
"|**Упражнение**|**Вес**|**Подходы**|",
]
filtered_lines = [line for line in lines if line not in redundant_lines]
return "\n".join(filtered_lines)
def parse_training_header(
training_data_line: str,
) -> Tuple[bool, str, str, str]:
pattern: str = (
r"^\*\*(?P<date>\d+.\d+.\d+)\s\((?P<trainer>.+)(-(?P<year_counter>.+))?\)\*\*"
)
match = re.search(pattern, training_data_line)
if match:
date = match.group("date").strip()
trainer = match.group("trainer").strip()
if match.group("year_counter"):
year_count = match.group("year_counter").strip()
else:
year_count = 0
return True, date, trainer, year_count
return False, "", "", ""
def serialize_exercise(reps: str, weight: str, name: str) -> Exercise:
# Split reps into array of int's
reps: List[int] = [int(rep) for rep in reps.split("-")]
weight_splitted: bool = False
if weight:
weight: List[str] = [weight for weight in weight.split("-")]
# Check if weight is splitted
if any(split_anchor in weight[0] for split_anchor in ["x", "х"]):
weight_splitted = True
splitter = "x" if "x" in weight[0] else "х"
weight: List[float] = [xweight.split(splitter)[0] for xweight in weight]
approaches = []
if not weight:
for rep_index in range(0, len(reps)):
approach = Approach(weight=0, reps=reps[rep_index])
approaches.append(approach)
else:
weight_pointer = 0
for rep_index in range(0, len(reps)):
approach = Approach(weight=weight[weight_pointer], reps=reps[rep_index])
if rep_index < len(weight) - 1:
weight_pointer += 1
approaches.append(approach)
exercise = Exercise(
name=name, approaches=approaches, splitted_weight=weight_splitted
)
return exercise
def parse_training_exercises(exercise_line: str) -> Exercise:
stripped: List[str] = [entry.strip() for entry in exercise_line.split("|")][1:-1]
for entry in stripped:
if entry in ["Упражнение", "Вес", "Подходы"]:
raise ValueError
if stripped:
if "---" in stripped[0]:
raise ValueError
if len(stripped) != 3:
raise ValueError
return serialize_exercise(
name=stripped[0], weight=stripped[1], reps=stripped[2]
)
def parse_training_data():
training_data: str = filter_training_data(read_example_file("full.txt"))
lines = training_data.splitlines()
current_training = None
trains = []
for index, line in enumerate(lines):
header_parsed, date, trainer, year_count = parse_training_header(line)
if index == len(lines) - 1:
trains.append(current_training)
if header_parsed:
trains.append(current_training)
try:
current_training = Training(
date=datetime.strptime(date, "%d.%m.%Y").date(), exercises=[]
)
except ValueError:
current_training = Training(
date=datetime.strptime(date, "%d.%m.%y").date(), exercises=[]
)
continue
try:
exr = parse_training_exercises(line)
current_training.exercises.append(exr)
except ValueError:
pass
return trains[1:]
def remap_unique_exercises(apple_trainings: List[Training]) -> List[Training]:
for apple_training in apple_trainings:
if not apple_training:
continue
for apple_exercise in apple_training.exercises:
if not apple_exercise:
continue
print(f"{apple_training.date} : {apple_exercise}")
apple_exercise.name = unique_apple_exercises_mapper.get(apple_exercise.name)
return apple_trainings

View file

@ -1,11 +0,0 @@
version: '3'
services:
database:
image: 'postgres:latest'
ports:
- 5433:5432
env_file:
- .env
environment:
POSTGRES_DB: fitness_database

View file

View file

View file

@ -1,15 +0,0 @@
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
from dbapi.tables import metadata_obj
class FitnessDatabseMigrator:
"""Class for performing management operations with database"""
def __init__(self, async_engine: AsyncEngine) -> None:
self.engine = async_engine
async def reset_database(self):
"""Method for dropping all tables and create them from tables metadata"""
async with self.engine.begin() as conn:
await conn.run_sync(metadata_obj.drop_all)
await conn.run_sync(metadata_obj.create_all)

View file

@ -1,27 +0,0 @@
from dbapi.repositories.utils import DatabaseInterfasesMixin
from sqlalchemy import insert
from dbapi.tables import approach
class ApproachRepository(DatabaseInterfasesMixin):
"""Approach table repository"""
def create_approach(self, exercise_pk: int, weight: float, reps: int) -> int:
"""Method for creating new instance of approach table
Args:
exercise_pk: Primary key of an associated exercise
weight: Approach weight
reps: Amount of reps in approach
Returns:
Primary key of created exercise entry
"""
new_instance_statement = insert(approach).values(
Exercise=exercise_pk, Weight=weight, Reps=reps
)
with self.engine.connect() as conn:
result = conn.execute(new_instance_statement)
inserted_entry_pk: int = result.inserted_primary_key[0]
conn.commit()
return inserted_entry_pk

View file

@ -1,25 +0,0 @@
from sqlalchemy import insert
from dbapi.repositories.utils import DatabaseInterfasesMixin
from dbapi.tables import exercise
class ExerciseRepository(DatabaseInterfasesMixin):
"""Exercise table repository"""
def create_exercise(self, training_pk: int, exercise_name: str) -> int:
"""Method for creating new instance of exercise table
Args:
training_pk: Primary key of associated training instance
exercise_name: Name of an exercise
Returns:
Primary key of created exercise entry
"""
new_instance_statement = insert(exercise).values(
Training=training_pk, Name=exercise_name
)
with self.engine.connect() as conn:
result = conn.execute(new_instance_statement)
inserted_entry_pk: int = result.inserted_primary_key[0]
conn.commit()
return inserted_entry_pk

View file

@ -1,23 +0,0 @@
from sqlalchemy import insert
from datetime import date
from dbapi.repositories.utils import DatabaseInterfasesMixin
from dbapi.tables import training
class TrainingRepository(DatabaseInterfasesMixin):
"""Training table repository"""
def create_training(self, date: date) -> int:
"""Method for creating new instance of training
Args:
date: date of a training
Returns:
Primary key of created training entry
"""
new_instance_statement = insert(training).values(Date=date)
with self.engine.connect() as conn:
result = conn.execute(new_instance_statement)
inerted_entry_pk: int = result.inserted_primary_key[0]
conn.commit()
return inerted_entry_pk

View file

@ -1,8 +0,0 @@
from sqlalchemy import Engine
class DatabaseInterfasesMixin:
"""Mixin for interfaces, that works with database"""
def __init__(self, engine: Engine) -> None:
self.engine: Engine = engine

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

18
main.py
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()

View file

@ -1,190 +0,0 @@
import asyncio
from collections import defaultdict
from pprint import pprint
import os
from typing import Dict, List
from sqlalchemy import Table, create_engine, text, insert
from dotenv import load_dotenv
from sqlalchemy.ext.asyncio import create_async_engine
from dbapi.migrator import FitnessDatabseMigrator
from dbapi.repositories.approach_repo import ApproachRepository
from dbapi.repositories.exercise_repo import ExerciseRepository
from dbapi.repositories.training_repo import TrainingRepository
from dbapi.tables import metadata_obj, training, exercise, approach
from obsidian.notes_parser import parse_training_data, remap_unique_exercises
from apple.notes_parser import parse_training_data as apple_parse_training_data
from apple.notes_parser import remap_unique_exercises as apple_remaper
from obsidian.py_models import Training
# LOADING DATA
# load_dotenv()
#
# DB_USERNAME = os.getenv("POSTGRES_USER")
# DB_PASS = os.getenv("POSTGRES_PASSWORD")
#
# engine = create_engine(
# f"postgresql+psycopg2://{DB_USERNAME}:{DB_PASS}@localhost:5433/fitness_database",
# echo=True,
# )
#
# # Creating async engine for Database connection
# async_engine = create_async_engine(
# f"postgresql+asyncpg://{DB_USERNAME}:{DB_PASS}@localhost:5433/fitness_database",
# echo=True,
# )
# NOTE: "Begin once" style - using `.begin` as context creator for SQLAlchemy
# with engine.begin() as conn:
# result = conn.execute(text("select 'hello world'"))
# print(result.all())
# conn.execute(
# text("INSERT INTO some_table(x, y) VALUES (:x, :y)"),
# [{"x": 6, "y": 7}, {"x": 9, "y": 10}],
# )
# NOTE: "Commit as you go" style - after managing transactions we need to call Connection.commit(). Otherwise ROLLBACK
# will be executed
# with engine.connect() as conn:
# result = conn.execute(text("SELECT x, y FROM some_table"))
# for row in result:
# print(f"x: {row.x} -- y: {row.y}")
# NOTE : Create all tables from metadata object
# metadata_obj.create_all(engine)
# TODO: Check how psycopg2 handles duplication of tables
# TODO: Check how migrations are done
# NOTE: Drop all Tables from database
metadata_obj.drop_all(engine)
metadata_obj.create_all(engine)
# NOTE: Table reflection - generating table object from existing tables (only tables, that are stored in metadata)
# some_table = Table("some_table", metadata_obj, autoload_with=engine)
# print(some_table.c)
# -----
# Inserting training values into database
trainings: List[Training] = parse_training_data()
for train in trainings:
if not train:
continue
else:
print(train)
new_training_pk: int = TrainingRepository(engine).create_training(train.date)
for exr in train.exercises:
approach_statements = []
new_exercise_pk: int = ExerciseRepository(engine).create_exercise(
training_pk=new_training_pk, exercise_name=exr.name
)
for appr in exr.approaches:
new_approach_pk: int = ApproachRepository(engine).create_approach(
exercise_pk=new_exercise_pk, weight=appr.weight, reps=appr.reps
)
print("-------------------------\n" * 2)
print("-------------------------\n" * 2)
# -----
# Calculating unique exercises for obsidian
# trainings: List[Training] = parse_training_data()
#
#
# unique_exercise_names = defaultdict(int)
# counter = 0
#
# for train in trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# counter += 1
# unique_exercise_names[exr.name] += 1
#
# pprint(unique_exercise_names)
# print(counter)
# parsed_trainings = remap_unique_exercises(trainings)
#
# print("\n" * 3)
#
# unique_exercise_parsed_names = defaultdict(int)
# p_counter = 0
# for train in parsed_trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# p_counter += 1
# unique_exercise_parsed_names[exr.name] += 1
# pprint(unique_exercise_parsed_names)
# print(p_counter)
# Apple notes playground
# trainings: List[Training] = apple_parse_training_data()
#
#
# unique_exercise_names = defaultdict(int)
# counter = 0
#
# for train in trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# if exr:
# counter += 1
# unique_exercise_names[exr.name] += 1
#
# pprint(unique_exercise_names)
# print(counter)
#
# parsed_trainings = apple_remaper(trainings)
#
# print("\n" * 3)
#
# unique_exercise_parsed_names = defaultdict(int)
# p_counter = 0
# for train in parsed_trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# if exr:
# p_counter += 1
# unique_exercise_parsed_names[exr.name] += 1
# pprint(unique_exercise_parsed_names)
# print(p_counter)
# Combined trainings
# obsidian_trainings: List[Training] = parse_training_data()
# obsidian_parsed_trainings = remap_unique_exercises(obsidian_trainings)
#
# apple_trainings: List[Training] = apple_parse_training_data()
# apple_parsed_trainings = apple_remaper(apple_trainings)
#
#
# combined_trainings = obsidian_trainings + apple_trainings
# unique_exercise_parsed_names = defaultdict(int)
# for train in combined_trainings:
# if not train:
# continue
# if train.exercises:
# for exr in train.exercises:
# if exr:
# unique_exercise_parsed_names[exr.name] += 1
# pprint(unique_exercise_parsed_names)
# print(len(combined_trainings))
# Async engine playground
# fbm = FitnessDatabseMigrator(async_engine=async_engine)
#
# asyncio.run(fbm.reset_database())

View file

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,156 +0,0 @@
list_of_unique_names = [
"Тяга горизонтального блока",
"Тяга горизонтального блока (по очереди)",
"Тяга гантелей в наклоне (по очереди)",
"Тяга гантелей на скамье",
"Тяга вертикального блока",
"Тяга вертикального блока (обратный хват)",
"Разгибание рук сидя (трицепс машина)",
"Подъем штанги на бицепс стоя",
"Подъем гантелей на бицепс стоя",
"Сгибание ног сидя",
"Сгибание ног лежа",
"Сведение рук в пек-дек",
"Румынская тяга",
"Разгибание ног сидя",
"Разведение рук в стороны стоя (гантели)",
"Разведение рук в стороны в наклоне (гантели)",
"Приседания",
"Подъём ног в висе",
"Подтягивания",
"Подтягивания обратным хватом",
"Отжимания",
"Отведение рук в кроссовере (по очереди)",
"Разведение рук в пек-дек (по очереди)",
"Разведение рук в пек-дек",
"Отжимание на трицепс в кроссовере",
"Баттерфляй",
"Болгарские сплит-приседения",
"Брусья",
"Вертикальная тяга одной рукой",
"Выпады",
"Гиперэкстензия",
"Гравитрон",
"Гребная тяга с упором в грудь (по очереди)",
"Разведение рук в стороны (дельт-машина)",
"Жим гантелей лежа",
"Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей сидя",
"Жим ногами",
"Жим от груди сидя в тренажере (рычаги)",
"Жим от плеч вверх в тренажере (рычаги)",
"Икроножные сидя",
]
obsidian_unique_exercies_mapping = {
"Баттерфляй": "Баттерфляй",
"Болгарские приседания на одну ногу": "Болгарские сплит-приседения",
"Брусья": "Брусья",
"Брусья узким хватом": "Брусья",
"Вертикальная тяга одной рукой 45⁰": "Вертикальная тяга одной рукой",
"Выпады вперед по очереди каждой ногой": "Выпады",
"Выпады с гантелями на одну ногу вперед": "Выпады",
"Гиперэкстензия": "Гиперэкстензия",
"Гравитрон": "Гравитрон",
"Гравитрон (медленно вниз)": "Гравитрон",
"Гребная тяга с упорм в грудь": "Гребная тяга с упором в грудь",
"Гребная тяга с упором в грудь": "Гребная тяга с упором в грудь",
"Гребная тяга с упором в грудь (одна рука)": "Гребная тяга с упором в грудь (по очереди)",
"Дельт машина": "Разведение рук в стороны (дельт-машина)",
"Дельт машина (разведение рук в стороны)": "Разведение рук в стороны (дельт-машина)",
"Жим гантелей лежа": "Жим гантелей лежа",
"Жим гантелей лежа на скамье": "Жим гантелей лежа",
"Жим гантелей лежа на скамье 30⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей лёжа": "Жим гантелей лежа",
"Жим гантелей лёжа на скамейке 45⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей на скамье 65⁰": "Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей сидя": "Жим гантелей сидя",
"Жим гантелей сидя 80⁰": "Жим гантелей сидя",
"Жим гантелей сидя 85⁰": "Жим гантелей сидя",
"Жим гантелей сидя 8⁰": "Жим гантелей сидя",
"Жим гантелей сидя 90⁰": "Жим гантелей сидя",
"Жим гантелей сидя на скамье": "Жим гантелей сидя",
"Жим ногами": "Жим ногами",
"Жим ногами ш-ш-ш": "Жим ногами",
"Жим от груди (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди рычаги": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя в тренажере (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя в тренажёре (рычаги)": "Жим от груди сидя в тренажере (рычаги)",
"Жим от груди сидя рычаги": "Жим от груди сидя в тренажере (рычаги)",
"Жим от плеч вверх (тренажёр, рычаги)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх в тренажёре": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч вверх рычаги": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя (рычаги наверху)": "Жим от плеч вверх в тренажере (рычаги)",
"Жим от плеч сидя в тренажере (рычаги)": "Жим от плеч вверх в тренажере (рычаги)",
"Икроножные сидя": "Икроножные сидя",
"Икроножные сидя за": "Икроножные сидя",
"Кроссовер - отжимание на трицепс": "Отжимание на трицепс в кроссовере",
"Мах руки в кроссовере": "Отведение рук в кроссовере (по очереди)",
"Отведение плеча в сторону в кроссовере": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовере из за спины": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в кроссовере по очереди каждую руку": "Отведение рук в кроссовере (по очереди)",
"Отведение руки в пек дек (по очереди каждой рукой)": "Разведение рук в пек-дек (по очереди)",
"Отведение руки в пек дек (по очереди)": "Разведение рук в пек-дек (по очереди)",
"Отведение руки в сторону (дефоли) в кроссовере": "Отведение рук в кроссовере (по очереди)",
"Отведение руки назад в кроссовере (аналог пек дек одной рукой)": "Разведение рук в пек-дек (по очереди)",
"Отжимания": "Отжимания",
"Подтягивания": "Подтягивания",
"Подтягивания обратным хватом": "Подтягивания обратным хватом",
"Подтянивания": "Подтягивания",
"Подъём ног в висе": "Подъём ног в висе",
"Приседания": "Приседания",
"Разведение рук а стороны сидя": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в наклоне": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в наклоне сидя": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в стороны": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны (дельт машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны (дельт-машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны в наклоне с гантелями": "Разведение рук в стороны в наклоне (гантели)",
"Разведение рук в стороны в тренажаре": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны с гантелями стоя": "Разведение рук в стороны стоя (гантели)",
"Разведение рук в стороны сидя": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны сидя спиной к тренажеру": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стороны стоя": "Разведение рук в стороны стоя (гантели)",
"Разведение рук в строоны (дельт-машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук в стророны (дельт-машина)": "Разведение рук в стороны (дельт-машина)",
"Разведение рук назад в пек дек": "Разведение рук в пек-дек",
"Разведение рук назад пёк дек": "Разведение рук в пек-дек",
"Разведение рук пек дек": "Разведение рук в пек-дек",
"Разведение рук пёк дек": "Разведение рук в пек-дек",
"Разгибание ног сидя": "Разгибание ног сидя",
"Разгибание рук сидя (трицепс машина)": "Разгибание рук сидя (трицепс машина)",
"Румынская тяга": "Румынская тяга",
"Сведение пек дек": "Сведение рук в пек-дек",
"Сведение рук в пек дек": "Сведение рук в пек-дек",
"Сведение рук в пек декх": "Сведение рук в пек-дек",
"Сведение рук пек дек": "Сведение рук в пек-дек",
"Сведение рук пёк дек": "Сведение рук в пек-дек",
"Сгибание ног лежа": "Сгибание ног лежа",
"Сгибание ног лёжа": "Сгибание ног лежа",
"Сгибание ног сидя": "Сгибание ног сидя",
"Сгибание рук с гантелями стоя (супинирование?)": "Подъем гантелей на бицепс стоя",
"Сгибание штанги стоя на бицепс": "Подъем штанги на бицепс стоя",
"Трицепс машина": "Разгибание рук сидя (трицепс машина)",
"Тяга вертикального блока": "Тяга вертикального блока",
"Тяга вертикального блока обратным хватом": "Тяга вертикального блока (обратный хват)",
"Тяга вертикального блока прямым хватом": "Тяга вертикального блока",
"Тяга верхнего блока": "Тяга вертикального блока",
"Тяга верхнего блока за": "Тяга вертикального блока",
"Тяга гантелей в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантелей к поясу лёжа на животе на скамье": "Тяга гантелей на скамье",
"Тяга гантелей лежа на животе на скамье 80°": "Тяга гантелей на скамье",
"Тяга гантелей на скамье": "Тяга гантелей на скамье",
"Тяга гантели в наклоне": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне 1 рукой": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне к поясу к стойки": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне одной рукой": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели в наклоне одной рукой (каждой)": "Тяга гантелей в наклоне (по очереди)",
"Тяга гантели лежа в наклоне на скамье": "Тяга гантелей на скамье",
"Тяга горизонтально блока одной рукой": "Тяга горизонтального блока (по очереди)",
"Тяга горизонтального блока": "Тяга горизонтального блока",
"Тяга горизонтального блока 1 рукой поочерёдно": "Тяга горизонтального блока (по очереди)",
"Тяга горизонтального блока одной рукой": "Тяга горизонтального блока (по очереди)",
}

View file

@ -1,121 +0,0 @@
import os
import re
from pprint import pprint
from typing import List, Tuple
from datetime import datetime
from obsidian.mapper import obsidian_unique_exercies_mapping
from obsidian.py_models import Approach, Exercise, Training
current_directory = os.path.dirname(os.path.abspath(__file__))
def get_current_path():
return current_directory
def get_obsidian_examples_file(example_file_name: str):
return os.path.join(get_current_path(), f"examples/{example_file_name}")
def read_example_file(example_file_name: str):
path_to_example: str = get_obsidian_examples_file(example_file_name)
with open(path_to_example, "r") as f:
content = f.read()
return content
def serialize_exercise(reps: str, weight: str, name: str) -> Exercise:
# Split reps into array of int's
reps: List[int] = [int(rep) for rep in reps.split("-")]
weight_splitted: bool = False
if weight:
weight: List[str] = [weight for weight in weight.split("-")]
# Check if weight is splitted
if any(split_anchor in weight[0] for split_anchor in ["x", "х"]):
weight_splitted = True
splitter = "x" if "x" in weight[0] else "х"
weight: List[float] = [xweight.split(splitter)[0] for xweight in weight]
approaches = []
if not weight:
for rep_index in range(0, len(reps)):
approach = Approach(weight=0, reps=reps[rep_index])
approaches.append(approach)
else:
weight_pointer = 0
for rep_index in range(0, len(reps)):
approach = Approach(weight=weight[weight_pointer], reps=reps[rep_index])
if rep_index < len(weight) - 1:
weight_pointer += 1
approaches.append(approach)
exercise = Exercise(
name=name, approaches=approaches, splitted_weight=weight_splitted
)
return exercise
def parse_training_exercises(exercise_line: str) -> Exercise:
stripped: List[str] = [entry.strip() for entry in exercise_line.split("|")][1:-1]
for entry in stripped:
if entry in ["Упражнение", "Вес", "Подходы"]:
raise ValueError
if stripped:
if "---" in stripped[0]:
raise ValueError
if len(stripped) != 3:
raise ValueError
return serialize_exercise(
name=stripped[0], weight=stripped[1], reps=stripped[2]
)
def parse_training_header(
training_data_line: str,
) -> Tuple[bool, str, str, str]:
pattern: str = r"#\s(?P<date>\d+.\d+.\d+)\s\((?P<trainer>.+)-(?P<year_counter>.+)\)"
match = re.search(pattern, training_data_line)
if match:
date = match.group("date").strip()
trainer = match.group("trainer").strip()
year_count = match.group("year_counter").strip()
return True, date, trainer, year_count
return False, "", "", ""
def filter_training_data(training_data: str):
cleaned_text = re.sub(r"^\s*?\n", "", training_data, flags=re.MULTILINE)
return cleaned_text
def parse_training_data():
training_data: str = filter_training_data(read_example_file("full.txt"))
lines = training_data.splitlines()
current_training = None
trains = []
for index, line in enumerate(lines):
header_parsed, date, trainer, year_count = parse_training_header(line)
if index == len(lines) - 1:
trains.append(current_training)
if header_parsed:
trains.append(current_training)
current_training = Training(
date=datetime.strptime(date, "%d.%m.%Y").date(), exercises=[]
)
continue
try:
exr = parse_training_exercises(line)
current_training.exercises.append(exr)
except ValueError:
pass
return trains
def remap_unique_exercises(obsidian_trainings: List[Training]) -> List[Training]:
for obsidian_training in obsidian_trainings:
if not obsidian_training:
continue
for obsidian_exercise in obsidian_training.exercises:
obsidian_exercise.name = obsidian_unique_exercies_mapping.get(
obsidian_exercise.name
)
return obsidian_trainings

View file

@ -1,22 +0,0 @@
from typing import List, Optional
from pydantic import BaseModel
from datetime import date
class Approach(BaseModel):
weight: float
reps: int
class Exercise(BaseModel):
name: str
splitted_weight: bool = False
approaches: List[Approach]
class Training(BaseModel):
date: date
exercises: Optional[List[Exercise]]
class Coach(BaseModel):
name: str

View file

@ -1,72 +0,0 @@
from obsidian.notes_parser import serialize_exercise
from obsidian.py_models import Approach, Exercise
import pytest
@pytest.mark.parametrize(
"reps, weight, name, expected",
[
(
"12-12-12-10",
"55-59",
"test_exercise",
Exercise(
name="test_exercise",
splitted_weight=False,
approaches=[
Approach(weight=55, reps=12),
Approach(weight=59, reps=12),
Approach(weight=59, reps=12),
Approach(weight=59, reps=10),
],
),
),
(
"11-9-7",
"",
"test_exercise",
Exercise(
name="test_exercise",
splitted_weight=False,
approaches=[
Approach(weight=0, reps=11),
Approach(weight=0, reps=9),
Approach(weight=0, reps=7),
],
),
),
(
"12-12-12-12",
"15х2-25х2-27.5х2-30х2",
"test_exercise",
Exercise(
name="test_exercise",
splitted_weight=True,
approaches=[
Approach(weight=15, reps=12),
Approach(weight=25, reps=12),
Approach(weight=27.5, reps=12),
Approach(weight=30, reps=12),
],
),
),
(
"12-12-12-12",
"15х2-25х2",
"test_exercise",
Exercise(
name="test_exercise",
splitted_weight=True,
approaches=[
Approach(weight=15, reps=12),
Approach(weight=25, reps=12),
Approach(weight=25, reps=12),
Approach(weight=25, reps=12),
],
),
),
],
)
def test_approach_parsing(reps, weight, name, expected):
exercise = serialize_exercise(reps, weight, name)
assert expected == exercise

View file

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) -> None:
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())

773
poetry.lock generated
View file

@ -1,773 +0,0 @@
# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
[[package]]
name = "annotated-types"
version = "0.7.0"
description = "Reusable constraint types to use with typing.Annotated"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
]
[[package]]
name = "async-timeout"
version = "5.0.1"
description = "Timeout context manager for asyncio programs"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
{file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
]
[[package]]
name = "asyncpg"
version = "0.30.0"
description = "An asyncio PostgreSQL driver"
category = "main"
optional = false
python-versions = ">=3.8.0"
files = [
{file = "asyncpg-0.30.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfb4dd5ae0699bad2b233672c8fc5ccbd9ad24b89afded02341786887e37927e"},
{file = "asyncpg-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc1f62c792752a49f88b7e6f774c26077091b44caceb1983509edc18a2222ec0"},
{file = "asyncpg-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3152fef2e265c9c24eec4ee3d22b4f4d2703d30614b0b6753e9ed4115c8a146f"},
{file = "asyncpg-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7255812ac85099a0e1ffb81b10dc477b9973345793776b128a23e60148dd1af"},
{file = "asyncpg-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:578445f09f45d1ad7abddbff2a3c7f7c291738fdae0abffbeb737d3fc3ab8b75"},
{file = "asyncpg-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c42f6bb65a277ce4d93f3fba46b91a265631c8df7250592dd4f11f8b0152150f"},
{file = "asyncpg-0.30.0-cp310-cp310-win32.whl", hash = "sha256:aa403147d3e07a267ada2ae34dfc9324e67ccc4cdca35261c8c22792ba2b10cf"},
{file = "asyncpg-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb622c94db4e13137c4c7f98834185049cc50ee01d8f657ef898b6407c7b9c50"},
{file = "asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a"},
{file = "asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed"},
{file = "asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a"},
{file = "asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956"},
{file = "asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056"},
{file = "asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454"},
{file = "asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d"},
{file = "asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f"},
{file = "asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e"},
{file = "asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a"},
{file = "asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3"},
{file = "asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737"},
{file = "asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a"},
{file = "asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af"},
{file = "asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e"},
{file = "asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305"},
{file = "asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70"},
{file = "asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3"},
{file = "asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33"},
{file = "asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4"},
{file = "asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4"},
{file = "asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba"},
{file = "asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590"},
{file = "asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e"},
{file = "asyncpg-0.30.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ff1fc8b5bf724273782ff8b4f57b0f8220a1b2324184846b39d1ab4122031d"},
{file = "asyncpg-0.30.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64e899bce0600871b55368b8483e5e3e7f1860c9482e7f12e0a771e747988168"},
{file = "asyncpg-0.30.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b290f4726a887f75dcd1b3006f484252db37602313f806e9ffc4e5996cfe5cb"},
{file = "asyncpg-0.30.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f86b0e2cd3f1249d6fe6fd6cfe0cd4538ba994e2d8249c0491925629b9104d0f"},
{file = "asyncpg-0.30.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:393af4e3214c8fa4c7b86da6364384c0d1b3298d45803375572f415b6f673f38"},
{file = "asyncpg-0.30.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fd4406d09208d5b4a14db9a9dbb311b6d7aeeab57bded7ed2f8ea41aeef39b34"},
{file = "asyncpg-0.30.0-cp38-cp38-win32.whl", hash = "sha256:0b448f0150e1c3b96cb0438a0d0aa4871f1472e58de14a3ec320dbb2798fb0d4"},
{file = "asyncpg-0.30.0-cp38-cp38-win_amd64.whl", hash = "sha256:f23b836dd90bea21104f69547923a02b167d999ce053f3d502081acea2fba15b"},
{file = "asyncpg-0.30.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f4e83f067b35ab5e6371f8a4c93296e0439857b4569850b178a01385e82e9ad"},
{file = "asyncpg-0.30.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5df69d55add4efcd25ea2a3b02025b669a285b767bfbf06e356d68dbce4234ff"},
{file = "asyncpg-0.30.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3479a0d9a852c7c84e822c073622baca862d1217b10a02dd57ee4a7a081f708"},
{file = "asyncpg-0.30.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26683d3b9a62836fad771a18ecf4659a30f348a561279d6227dab96182f46144"},
{file = "asyncpg-0.30.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1b982daf2441a0ed314bd10817f1606f1c28b1136abd9e4f11335358c2c631cb"},
{file = "asyncpg-0.30.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1c06a3a50d014b303e5f6fc1e5f95eb28d2cee89cf58384b700da621e5d5e547"},
{file = "asyncpg-0.30.0-cp39-cp39-win32.whl", hash = "sha256:1b11a555a198b08f5c4baa8f8231c74a366d190755aa4f99aacec5970afe929a"},
{file = "asyncpg-0.30.0-cp39-cp39-win_amd64.whl", hash = "sha256:8b684a3c858a83cd876f05958823b68e8d14ec01bb0c0d14a6704c5bf9711773"},
{file = "asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851"},
]
[package.dependencies]
async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.11.0\""}
[package.extras]
docs = ["Sphinx (>=8.1.3,<8.2.0)", "sphinx-rtd-theme (>=1.2.2)"]
gssauth = ["gssapi", "sspilib"]
test = ["distro (>=1.9.0,<1.10.0)", "flake8 (>=6.1,<7.0)", "flake8-pyi (>=24.1.0,<24.2.0)", "gssapi", "k5test", "mypy (>=1.8.0,<1.9.0)", "sspilib", "uvloop (>=0.15.3)"]
[[package]]
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
[[package]]
name = "exceptiongroup"
version = "1.2.2"
description = "Backport of PEP 654 (exception groups)"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
{file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
]
[package.extras]
test = ["pytest (>=6)"]
[[package]]
name = "greenlet"
version = "3.1.1"
description = "Lightweight in-process concurrent programming"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
{file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
{file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
{file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
{file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
{file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
{file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
{file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
{file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
{file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
{file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
{file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
{file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
{file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
{file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
{file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
{file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
{file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
{file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
{file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
{file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
{file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
{file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
{file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
{file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
{file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
{file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
{file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
{file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
{file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
{file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
{file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
{file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
{file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
{file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
{file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
{file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
{file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
{file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
{file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
{file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
{file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
{file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
{file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
{file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
{file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
{file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
{file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
{file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
{file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
{file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
{file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
{file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
{file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
{file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
{file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
{file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
{file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
{file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
{file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
{file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
{file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
{file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
{file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
{file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
{file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
{file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
{file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
{file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
{file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
{file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
{file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
{file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
]
[package.extras]
docs = ["Sphinx", "furo"]
test = ["objgraph", "psutil"]
[[package]]
name = "grpcio"
version = "1.70.0"
description = "HTTP/2-based RPC framework"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"},
{file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"},
{file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:374d014f29f9dfdb40510b041792e0e2828a1389281eb590df066e1cc2b404e5"},
{file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2af68a6f5c8f78d56c145161544ad0febbd7479524a59c16b3e25053f39c87f"},
{file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7df14b2dcd1102a2ec32f621cc9fab6695effef516efbc6b063ad749867295"},
{file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c78b339869f4dbf89881e0b6fbf376313e4f845a42840a7bdf42ee6caed4b11f"},
{file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58ad9ba575b39edef71f4798fdb5c7b6d02ad36d47949cd381d4392a5c9cbcd3"},
{file = "grpcio-1.70.0-cp310-cp310-win32.whl", hash = "sha256:2b0d02e4b25a5c1f9b6c7745d4fa06efc9fd6a611af0fb38d3ba956786b95199"},
{file = "grpcio-1.70.0-cp310-cp310-win_amd64.whl", hash = "sha256:0de706c0a5bb9d841e353f6343a9defc9fc35ec61d6eb6111802f3aa9fef29e1"},
{file = "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a"},
{file = "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386"},
{file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b"},
{file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb5277db254ab7586769e490b7b22f4ddab3876c490da0a1a9d7c695ccf0bf77"},
{file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea"},
{file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:27cc75e22c5dba1fbaf5a66c778e36ca9b8ce850bf58a9db887754593080d839"},
{file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd"},
{file = "grpcio-1.70.0-cp311-cp311-win32.whl", hash = "sha256:bb491125103c800ec209d84c9b51f1c60ea456038e4734688004f377cfacc113"},
{file = "grpcio-1.70.0-cp311-cp311-win_amd64.whl", hash = "sha256:d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca"},
{file = "grpcio-1.70.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:ef4c14508299b1406c32bdbb9fb7b47612ab979b04cf2b27686ea31882387cff"},
{file = "grpcio-1.70.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:aa47688a65643afd8b166928a1da6247d3f46a2784d301e48ca1cc394d2ffb40"},
{file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:880bfb43b1bb8905701b926274eafce5c70a105bc6b99e25f62e98ad59cb278e"},
{file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e654c4b17d07eab259d392e12b149c3a134ec52b11ecdc6a515b39aceeec898"},
{file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2394e3381071045a706ee2eeb6e08962dd87e8999b90ac15c55f56fa5a8c9597"},
{file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b3c76701428d2df01964bc6479422f20e62fcbc0a37d82ebd58050b86926ef8c"},
{file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac073fe1c4cd856ebcf49e9ed6240f4f84d7a4e6ee95baa5d66ea05d3dd0df7f"},
{file = "grpcio-1.70.0-cp312-cp312-win32.whl", hash = "sha256:cd24d2d9d380fbbee7a5ac86afe9787813f285e684b0271599f95a51bce33528"},
{file = "grpcio-1.70.0-cp312-cp312-win_amd64.whl", hash = "sha256:0495c86a55a04a874c7627fd33e5beaee771917d92c0e6d9d797628ac40e7655"},
{file = "grpcio-1.70.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa573896aeb7d7ce10b1fa425ba263e8dddd83d71530d1322fd3a16f31257b4a"},
{file = "grpcio-1.70.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:d405b005018fd516c9ac529f4b4122342f60ec1cee181788249372524e6db429"},
{file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f32090238b720eb585248654db8e3afc87b48d26ac423c8dde8334a232ff53c9"},
{file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa089a734f24ee5f6880c83d043e4f46bf812fcea5181dcb3a572db1e79e01c"},
{file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19375f0300b96c0117aca118d400e76fede6db6e91f3c34b7b035822e06c35f"},
{file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7c73c42102e4a5ec76608d9b60227d917cea46dff4d11d372f64cbeb56d259d0"},
{file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:0a5c78d5198a1f0aa60006cd6eb1c912b4a1520b6a3968e677dbcba215fabb40"},
{file = "grpcio-1.70.0-cp313-cp313-win32.whl", hash = "sha256:fe9dbd916df3b60e865258a8c72ac98f3ac9e2a9542dcb72b7a34d236242a5ce"},
{file = "grpcio-1.70.0-cp313-cp313-win_amd64.whl", hash = "sha256:4119fed8abb7ff6c32e3d2255301e59c316c22d31ab812b3fbcbaf3d0d87cc68"},
{file = "grpcio-1.70.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:8058667a755f97407fca257c844018b80004ae8035565ebc2812cc550110718d"},
{file = "grpcio-1.70.0-cp38-cp38-macosx_10_14_universal2.whl", hash = "sha256:879a61bf52ff8ccacbedf534665bb5478ec8e86ad483e76fe4f729aaef867cab"},
{file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ba0a173f4feacf90ee618fbc1a27956bfd21260cd31ced9bc707ef551ff7dc7"},
{file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558c386ecb0148f4f99b1a65160f9d4b790ed3163e8610d11db47838d452512d"},
{file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:412faabcc787bbc826f51be261ae5fa996b21263de5368a55dc2cf824dc5090e"},
{file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3b0f01f6ed9994d7a0b27eeddea43ceac1b7e6f3f9d86aeec0f0064b8cf50fdb"},
{file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7385b1cb064734005204bc8994eed7dcb801ed6c2eda283f613ad8c6c75cf873"},
{file = "grpcio-1.70.0-cp38-cp38-win32.whl", hash = "sha256:07269ff4940f6fb6710951116a04cd70284da86d0a4368fd5a3b552744511f5a"},
{file = "grpcio-1.70.0-cp38-cp38-win_amd64.whl", hash = "sha256:aba19419aef9b254e15011b230a180e26e0f6864c90406fdbc255f01d83bc83c"},
{file = "grpcio-1.70.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4f1937f47c77392ccd555728f564a49128b6a197a05a5cd527b796d36f3387d0"},
{file = "grpcio-1.70.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:0cd430b9215a15c10b0e7d78f51e8a39d6cf2ea819fd635a7214fae600b1da27"},
{file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e27585831aa6b57b9250abaf147003e126cd3a6c6ca0c531a01996f31709bed1"},
{file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1af8e15b0f0fe0eac75195992a63df17579553b0c4af9f8362cc7cc99ccddf4"},
{file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbce24409beaee911c574a3d75d12ffb8c3e3dd1b813321b1d7a96bbcac46bf4"},
{file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ff4a8112a79464919bb21c18e956c54add43ec9a4850e3949da54f61c241a4a6"},
{file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5413549fdf0b14046c545e19cfc4eb1e37e9e1ebba0ca390a8d4e9963cab44d2"},
{file = "grpcio-1.70.0-cp39-cp39-win32.whl", hash = "sha256:b745d2c41b27650095e81dea7091668c040457483c9bdb5d0d9de8f8eb25e59f"},
{file = "grpcio-1.70.0-cp39-cp39-win_amd64.whl", hash = "sha256:a31d7e3b529c94e930a117b2175b2efd179d96eb3c7a21ccb0289a8ab05b645c"},
{file = "grpcio-1.70.0.tar.gz", hash = "sha256:8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56"},
]
[package.extras]
protobuf = ["grpcio-tools (>=1.70.0)"]
[[package]]
name = "grpcio-tools"
version = "1.70.0"
description = "Protobuf code generator for gRPC"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "grpcio_tools-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:4d456521290e25b1091975af71604facc5c7db162abdca67e12a0207b8bbacbe"},
{file = "grpcio_tools-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:d50080bca84f53f3a05452e06e6251cbb4887f5a1d1321d1989e26d6e0dc398d"},
{file = "grpcio_tools-1.70.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02e3bf55fb569fe21b54a32925979156e320f9249bb247094c4cbaa60c23a80d"},
{file = "grpcio_tools-1.70.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88a3ec6fa2381f616d567f996503e12ca353777941b61030fd9733fd5772860e"},
{file = "grpcio_tools-1.70.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6034a0579fab2aed8685fa1a558de084668b1e9b01a82a4ca7458b9bedf4654c"},
{file = "grpcio_tools-1.70.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:701bbb1ff406a21a771f5b1df6be516c0a59236774b6836eaad7696b1d128ea8"},
{file = "grpcio_tools-1.70.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eeb86864e1432fc1ab61e03395a2a4c04e9dd9c89db07e6fe68c7c2ac8ec24f"},
{file = "grpcio_tools-1.70.0-cp310-cp310-win32.whl", hash = "sha256:d53c8c45e843b5836781ad6b82a607c72c2f9a3f556e23d703a0e099222421fa"},
{file = "grpcio_tools-1.70.0-cp310-cp310-win_amd64.whl", hash = "sha256:22024caee36ab65c2489594d718921dcbb5bd18d61c5417a9ede94fd8dc8a589"},
{file = "grpcio_tools-1.70.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:5f5aba12d98d25c7ab2dd983939e2c21556a7d15f903b286f24d88d2c6e30c0a"},
{file = "grpcio_tools-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d47a6c6cfc526b290b7b53a37dd7e6932983f7a168b56aab760b4b597c47f30f"},
{file = "grpcio_tools-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5a9beadd1e24772ffa2c70f07d72f73330d356b78b246e424f4f2ed6c6713f3"},
{file = "grpcio_tools-1.70.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb8135eef160a62505f074bf7a3d62f3b13911c3c14037c5392bf877114213b5"},
{file = "grpcio_tools-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7ac9b3e13ace8467a586c53580ee22f9732c355583f3c344ef8c6c0666219cc"},
{file = "grpcio_tools-1.70.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:63f367363a4a1489a0046b19f9d561216ea0d206c40a6f1bf07a58ccfb7be480"},
{file = "grpcio_tools-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54ceffef59a059d2c7304554a8bbb20eedb05a3f937159ab1c332c1b28e12c9f"},
{file = "grpcio_tools-1.70.0-cp311-cp311-win32.whl", hash = "sha256:7a90a66a46821140a2a2b0be787dfabe42e22e9a5ba9cc70726b3e5c71a3b785"},
{file = "grpcio_tools-1.70.0-cp311-cp311-win_amd64.whl", hash = "sha256:4ebf09733545a69c166b02caa14c34451e38855544820dab7fdde5c28e2dbffe"},
{file = "grpcio_tools-1.70.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:ec5d6932c3173d7618267b3b3fd77b9243949c5ec04302b7338386d4f8544e0b"},
{file = "grpcio_tools-1.70.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:f22852da12f53b02a3bdb29d0c32fcabab9c7c8f901389acffec8461083f110d"},
{file = "grpcio_tools-1.70.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:7d45067e6efd20881e98a0e1d7edd7f207b1625ad7113321becbfe0a6ebee46c"},
{file = "grpcio_tools-1.70.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3020c97f03b30eee3c26aa2a55fbe003f1729c6f879a378507c2c78524db7c12"},
{file = "grpcio_tools-1.70.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7fd472fce3b33bdf7fbc24d40da7ab10d7a088bcaf59c37433c2c57330fbcb6"},
{file = "grpcio_tools-1.70.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3875543d74ce1a698a11f498f83795216ce929cb29afa5fac15672c7ba1d6dd2"},
{file = "grpcio_tools-1.70.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a130c24d617a3a57369da784080dfa8848444d41b7ae1250abc06e72e706a8d9"},
{file = "grpcio_tools-1.70.0-cp312-cp312-win32.whl", hash = "sha256:8eae17c920d14e2e451dbb18f5d8148f884e10228061941b33faa8fceee86e73"},
{file = "grpcio_tools-1.70.0-cp312-cp312-win_amd64.whl", hash = "sha256:99caa530242a0a832d8b6a6ab94b190c9b449d3e237f953911b4d56207569436"},
{file = "grpcio_tools-1.70.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:f024688d04e7a9429489ed695b85628075c3c6d655198ba3c6ccbd1d8b7c333b"},
{file = "grpcio_tools-1.70.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:1fa9a81621d7178498dedcf94eb8f276a7594327faf3dd5fd1935ce2819a2bdb"},
{file = "grpcio_tools-1.70.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c6da2585c0950cdb650df1ff6d85b3fe31e22f8370b9ee11f8fe641d5b4bf096"},
{file = "grpcio_tools-1.70.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70234b592af17050ec30cf35894790cef52aeae87639efe6db854a7fa783cc8c"},
{file = "grpcio_tools-1.70.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c021b040d0a9f5bb96a725c4d2b95008aad127d6bed124a7bbe854973014f5b"},
{file = "grpcio_tools-1.70.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:114a42e566e5b16a47e98f7910a6c0074b37e2d1faacaae13222e463d0d0d43c"},
{file = "grpcio_tools-1.70.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:4cae365d7e3ba297256216a9a256458b286f75c64603f017972b3ad1ee374437"},
{file = "grpcio_tools-1.70.0-cp313-cp313-win32.whl", hash = "sha256:ae139a8d3ddd8353f62af3af018e99ebcd2f4a237bd319cb4b6f58dd608aaa54"},
{file = "grpcio_tools-1.70.0-cp313-cp313-win_amd64.whl", hash = "sha256:04bf30c0eb2741defe3ab6e0a6102b022d69cfd39d68fab9b954993ceca8d346"},
{file = "grpcio_tools-1.70.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:076f71c6d5adcf237ebca63f1ed51098293261dab9f301e3dfd180e896e5fa89"},
{file = "grpcio_tools-1.70.0-cp38-cp38-macosx_10_14_universal2.whl", hash = "sha256:d1fc2112e9c40167086e2e6a929b253e5281bffd070fab7cd1ae019317ffc11d"},
{file = "grpcio_tools-1.70.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:904f13d2d04f88178b09d8ef89549b90cbf8792b684a7c72540fc1a9887697e2"},
{file = "grpcio_tools-1.70.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1de6c71833d36fb8cc8ac10539681756dc2c5c67e5d4aa4d05adb91ecbdd8474"},
{file = "grpcio_tools-1.70.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab788afced2d2c59bef86479967ce0b28485789a9f2cc43793bb7aa67f9528b"},
{file = "grpcio_tools-1.70.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:836293dcbb1e59fa52aa8aa890bd7a32a8eea7651cd614e96d86de4f3032fe73"},
{file = "grpcio_tools-1.70.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:740b3741d124c5f390dd50ad1c42c11788882baf3c202cd3e69adee0e3dde559"},
{file = "grpcio_tools-1.70.0-cp38-cp38-win32.whl", hash = "sha256:b9e4a12b862ba5e42d8028da311e8d4a2c307362659b2f4141d0f940f8c12b49"},
{file = "grpcio_tools-1.70.0-cp38-cp38-win_amd64.whl", hash = "sha256:fd04c93af460b1456cd12f8f85502503e1db6c4adc1b7d4bd775b12c1fd94fee"},
{file = "grpcio_tools-1.70.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:52d7e7ef11867fe7de577076b1f2ac6bf106b2325130e3de66f8c364c96ff332"},
{file = "grpcio_tools-1.70.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:0f7ed0372afd9f5eb938334e84681396257015ab92e03de009aa3170e64b24d0"},
{file = "grpcio_tools-1.70.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:24a5b0328ffcfe0c4a9024f302545abdb8d6f24921409a5839f2879555b96fea"},
{file = "grpcio_tools-1.70.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9387b30f3b2f46942fb5718624d7421875a6ce458620d6e15817172d78db1e1a"},
{file = "grpcio_tools-1.70.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4545264e06e1cd7fb21b9447bb5126330bececb4bc626c98f793fda2fd910bf8"},
{file = "grpcio_tools-1.70.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79b723ce30416e8e1d7ff271f97ade79aaf30309a595d80c377105c07f5b20fd"},
{file = "grpcio_tools-1.70.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1c0917dce12af04529606d437def83962d51c59dcde905746134222e94a2ab1b"},
{file = "grpcio_tools-1.70.0-cp39-cp39-win32.whl", hash = "sha256:5cb0baa52d4d44690fac6b1040197c694776a291a90e2d3c369064b4d5bc6642"},
{file = "grpcio_tools-1.70.0-cp39-cp39-win_amd64.whl", hash = "sha256:840ec536ab933db2ef8d5acaa6b712d0e9e8f397f62907c852ec50a3f69cdb78"},
{file = "grpcio_tools-1.70.0.tar.gz", hash = "sha256:e578fee7c1c213c8e471750d92631d00f178a15479fb2cb3b939a07fc125ccd3"},
]
[package.dependencies]
grpcio = ">=1.70.0"
protobuf = ">=5.26.1,<6.0dev"
setuptools = "*"
[[package]]
name = "iniconfig"
version = "2.0.0"
description = "brain-dead simple config-ini parsing"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
]
[[package]]
name = "packaging"
version = "24.2"
description = "Core utilities for Python packages"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
name = "pluggy"
version = "1.5.0"
description = "plugin and hook calling mechanisms for python"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
{file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
]
[package.extras]
dev = ["pre-commit", "tox"]
testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "protobuf"
version = "5.29.3"
description = ""
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
{file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
{file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"},
{file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"},
{file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"},
{file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"},
{file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"},
{file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"},
{file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"},
{file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"},
{file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"},
]
[[package]]
name = "psycopg2"
version = "2.9.10"
description = "psycopg2 - Python-PostgreSQL Database Adapter"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716"},
{file = "psycopg2-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a"},
{file = "psycopg2-2.9.10-cp311-cp311-win32.whl", hash = "sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2"},
{file = "psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4"},
{file = "psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067"},
{file = "psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e"},
{file = "psycopg2-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:91fd603a2155da8d0cfcdbf8ab24a2d54bca72795b90d2a3ed2b6da8d979dee2"},
{file = "psycopg2-2.9.10-cp39-cp39-win32.whl", hash = "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b"},
{file = "psycopg2-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442"},
{file = "psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11"},
]
[[package]]
name = "pydantic"
version = "2.10.5"
description = "Data validation using Python type hints"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"},
{file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"},
]
[package.dependencies]
annotated-types = ">=0.6.0"
pydantic-core = "2.27.2"
typing-extensions = ">=4.12.2"
[package.extras]
email = ["email-validator (>=2.0.0)"]
timezone = ["tzdata"]
[[package]]
name = "pydantic-core"
version = "2.27.2"
description = "Core functionality for Pydantic validation and serialization"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
{file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
{file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
{file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
{file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
{file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
{file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
{file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
{file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
{file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
{file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
{file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
{file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
{file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
{file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
{file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
{file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
{file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
{file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
{file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
{file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
{file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
{file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
{file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
{file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
{file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
{file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
{file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
{file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
{file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
{file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
{file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
{file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
{file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
{file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
{file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
{file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
{file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
{file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
{file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
{file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
]
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
[[package]]
name = "pytest"
version = "8.3.4"
description = "pytest: simple powerful testing with Python"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
{file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
]
[package.dependencies]
colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*"
packaging = "*"
pluggy = ">=1.5,<2"
tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "python-dotenv"
version = "1.0.1"
description = "Read key-value pairs from a .env file and set them as environment variables"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
{file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
]
[package.extras]
cli = ["click (>=5.0)"]
[[package]]
name = "setuptools"
version = "75.8.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
category = "main"
optional = false
python-versions = ">=3.9"
files = [
{file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"},
{file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"]
core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.14.0,<1.15.0)", "pytest-mypy"]
[[package]]
name = "sqlalchemy"
version = "2.0.37"
description = "Database Abstraction Library"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72"},
{file = "SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989"},
{file = "SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761"},
{file = "SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2"},
{file = "SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44f569d0b1eb82301b92b72085583277316e7367e038d97c3a1a899d9a05e342"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2eae3423e538c10d93ae3e87788c6a84658c3ed6db62e6a61bb9495b0ad16bb"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfff7be361048244c3aa0f60b5e63221c5e0f0e509f4e47b8910e22b57d10ae7"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5bc3339db84c5fb9130ac0e2f20347ee77b5dd2596ba327ce0d399752f4fce39"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:84b9f23b0fa98a6a4b99d73989350a94e4a4ec476b9a7dfe9b79ba5939f5e80b"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-win32.whl", hash = "sha256:51bc9cfef83e0ac84f86bf2b10eaccb27c5a3e66a1212bef676f5bee6ef33ebb"},
{file = "SQLAlchemy-2.0.37-cp37-cp37m-win_amd64.whl", hash = "sha256:8e47f1af09444f87c67b4f1bb6231e12ba6d4d9f03050d7fc88df6d075231a49"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6b788f14c5bb91db7f468dcf76f8b64423660a05e57fe277d3f4fad7b9dcb7ce"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521ef85c04c33009166777c77e76c8a676e2d8528dc83a57836b63ca9c69dcd1"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75311559f5c9881a9808eadbeb20ed8d8ba3f7225bef3afed2000c2a9f4d49b9"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce918ada64c956b62ca2c2af59b125767097ec1dca89650a6221e887521bfd7"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9d087663b7e1feabea8c578d6887d59bb00388158e8bff3a76be11aa3f748ca2"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cf95a60b36997dad99692314c4713f141b61c5b0b4cc5c3426faad570b31ca01"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-win32.whl", hash = "sha256:d75ead7dd4d255068ea0f21492ee67937bd7c90964c8f3c2bea83c7b7f81b95f"},
{file = "SQLAlchemy-2.0.37-cp38-cp38-win_amd64.whl", hash = "sha256:74bbd1d0a9bacf34266a7907d43260c8d65d31d691bb2356f41b17c2dca5b1d0"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:648ec5acf95ad59255452ef759054f2176849662af4521db6cb245263ae4aa33"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35bd2df269de082065d4b23ae08502a47255832cc3f17619a5cea92ce478b02b"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f581d365af9373a738c49e0c51e8b18e08d8a6b1b15cc556773bcd8a192fa8b"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82df02816c14f8dc9f4d74aea4cb84a92f4b0620235daa76dde002409a3fbb5a"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94b564e38b344d3e67d2e224f0aec6ba09a77e4582ced41e7bfd0f757d926ec9"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:955a2a765aa1bd81aafa69ffda179d4fe3e2a3ad462a736ae5b6f387f78bfeb8"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-win32.whl", hash = "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278"},
{file = "SQLAlchemy-2.0.37-cp39-cp39-win_amd64.whl", hash = "sha256:4b12885dc85a2ab2b7d00995bac6d967bffa8594123b02ed21e8eb2205a7584b"},
{file = "SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1"},
{file = "sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb"},
]
[package.dependencies]
greenlet = {version = "!=0.4.17", markers = "python_version < \"3.14\" and platform_machine == \"aarch64\" or python_version < \"3.14\" and platform_machine == \"ppc64le\" or python_version < \"3.14\" and platform_machine == \"x86_64\" or python_version < \"3.14\" and platform_machine == \"amd64\" or python_version < \"3.14\" and platform_machine == \"AMD64\" or python_version < \"3.14\" and platform_machine == \"win32\" or python_version < \"3.14\" and platform_machine == \"WIN32\""}
typing-extensions = ">=4.6.0"
[package.extras]
aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]
aioodbc = ["aioodbc", "greenlet (!=0.4.17)"]
aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
asyncio = ["greenlet (!=0.4.17)"]
asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"]
mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"]
mssql = ["pyodbc"]
mssql-pymssql = ["pymssql"]
mssql-pyodbc = ["pyodbc"]
mypy = ["mypy (>=0.910)"]
mysql = ["mysqlclient (>=1.4.0)"]
mysql-connector = ["mysql-connector-python"]
oracle = ["cx_oracle (>=8)"]
oracle-oracledb = ["oracledb (>=1.0.1)"]
postgresql = ["psycopg2 (>=2.7)"]
postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
postgresql-psycopg = ["psycopg (>=3.0.7)"]
postgresql-psycopg2binary = ["psycopg2-binary"]
postgresql-psycopg2cffi = ["psycopg2cffi"]
postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3_binary"]
[[package]]
name = "tomli"
version = "2.2.1"
description = "A lil' TOML parser"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
{file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
{file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
{file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
{file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
{file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
{file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
{file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
{file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
{file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
{file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
{file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
{file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
{file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
{file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
{file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
{file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
{file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
{file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
{file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
{file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
{file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
{file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
{file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
{file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
{file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
{file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
{file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
{file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
{file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
{file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
{file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
[[package]]
name = "typing-extensions"
version = "4.12.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
{file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "f590636643c34629bbb6f7b9bc0b20975fe3c6f86807ebb6408da99aae5a90b6"

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"

View file

View file

@ -1,61 +0,0 @@
list_of_unique_names = [
# Apple
"Жим штанги лежа",
"Жим штанги сидя (45 градусов)",
"Жим ногами (гакк-машина)",
"Подъем ног на турнике",
"Гантели молот",
"Гантели молот (по очереди)",
"Жим от груди сидя в тренажере (блоки)",
"Наклоны с прямой спиной",
"Разгибание спины",
"Скручивания",
"Тяга Т-грифа",
"Тяга штанги в наклоне",
"Тяга штанги в наклоне (обратным хватом)",
"Разгибание рук в наклоне (кик-бек)",
# Obsidian
"Тяга горизонтального блока",
"Тяга горизонтального блока (по очереди)",
"Тяга гантелей в наклоне (по очереди)",
"Тяга гантелей на скамье",
"Тяга вертикального блока",
"Тяга вертикального блока (обратный хват)",
"Разгибание рук сидя (трицепс машина)",
"Подъем штанги на бицепс стоя",
"Подъем гантелей на бицепс стоя",
"Подъем гантелей на бицепс сидя",
"Сгибание ног сидя",
"Сгибание ног лежа",
"Сведение рук в пек-дек",
"Румынская тяга",
"Разгибание ног сидя",
"Разведение рук в стороны стоя (гантели)",
"Разведение рук в стороны в наклоне (гантели)",
"Приседания",
"Подъём ног в висе",
"Подтягивания",
"Подтягивания обратным хватом",
"Отжимания",
"Отведение рук в кроссовере (по очереди)",
"Разведение рук в пек-дек (по очереди)",
"Разведение рук в пек-дек",
"Отжимание на трицепс в кроссовере",
"Баттерфляй",
"Болгарские сплит-приседения",
"Брусья",
"Вертикальная тяга одной рукой",
"Выпады",
"Гиперэкстензия",
"Гравитрон",
"Гребная тяга с упором в грудь",
"Гребная тяга с упором в грудь (по очереди)",
"Разведение рук в стороны (дельт-машина)",
"Жим гантелей лежа",
"Жим гантелей лежа (Под углом 45 градусов)",
"Жим гантелей сидя",
"Жим ногами",
"Жим от груди сидя в тренажере (рычаги)",
"Жим от плеч вверх в тренажере (рычаги)",
"Икроножные сидя",
]