Путеводитель разработчика Crisis Monitor
Введение
Цель этого документа – обеспечить быструю и безболезненную адаптацию новых разработчиков, а также установить единые стандарты и архитектурные правила для проекта. Следование этому руководству обязательно для всех, кто вносит изменения в кодовую базу. Это поможет нам избежать повторения критических ошибок, которые были допущены на ранних этапах разработки.
1. Настройка окружения
1.1. Зависимости Python
- Версия Python: Проект использует Python 3.11+. Рекомендуется использовать
pyenvдля управления версиями. - Виртуальное окружение: Всегда работайте в активированном виртуальном окружении (
venv). - Установка зависимостей:
- Для основной работы:
pip install -r requirements.txt - Для разработки (включая инструменты тестирования и линтинга):
pip install -r requirements-dev.txt
- Для основной работы:
1.2. Зависимости для Machine Learning (PyTorch)
Важно: В проекте используется PyTorch. Файлы зависимостей (requirements.txt) настроены для кросс-платформенной установки. В них не указаны специфичные для NVIDIA CUDA пакеты.
При выполнении pip install -r requirements.txt менеджер пакетов pip автоматически определит вашу ОС и архитектуру и установит подходящую версию PyTorch: - На macOS с Apple Silicon (M1/M2/M3/M4) будет установлена версия, использующая технологию Apple MPS для GPU-ускорения. - На Linux/Windows с GPU от NVIDIA будет установлена версия с поддержкой CUDA.
Ошибка No matching distribution found for nvidia-cublas-cu12...: Если вы столкнулись с этой ошибкой, это значит, что в вашем requirements.txt оказались платформо-зависимые пакеты. Убедитесь, что ваш файл соответствует версии из репозитория, где эти пакеты удалены.
1.3. База данных
Проект использует PostgreSQL. Убедитесь, что у вас установлен psycopg2-binary (он есть в requirements.txt) и что у вас есть доступ к работающему серверу PostgreSQL. Параметры подключения настраиваются в файле .env (см. config.py).
2. Ключевые архитектурные принципы
2.1. Единый источник истины для расширений Flask
Все глобальные объекты и расширения Flask (db, cache, migrate и т.д.) инициализируются только один раз в файле app/__init__.py.
Правило: Любой модуль должен импортировать эти объекты из пакета app.
# Правильно
from app.database import db
from app import cache
# НЕПРАВИЛЬНО! Запрещено создавать новые экземпляры в других файлах.
# from flask_sqlalchemy import SQLAlchemy
# db = SQLAlchemy()
Объект db находится в модуле app.database. Нарушение этого правила в прошлом привело к созданию "раздвоенного" объекта db и полной неработоспособности миграций базы данных.
2.2. Строгое направление зависимостей
Это самый важный архитектурный принцип в проекте для избежания циклических импортов.
Золотое правило: Низкоуровневые, переиспользуемые модули НИКОГДА не должны импортировать высокоуровневые модули на уровне всего файла. - Высокоуровневые модули: app, app/models, app/auth.py (любые Flask Blueprints). - Низкоуровневые модули: services/, utils/.
Пример нарушения:
# В файле services/some_service.py
from app.models import User # НЕПРАВИЛЬНО! Это создает цикл.
Правильное решение: Используйте защитный блок if TYPE_CHECKING: для аннотаций типов и локальные импорты внутри функций для реального использования.
# services/some_service.py
from __future__ import annotations
from typing import TYPE_CHECKING
# Импорты для аннотаций типов находятся здесь
if TYPE_CHECKING:
from app.models import User, Ticket # noqa: F401
class SomeService:
def get_user_by_ticket(self, ticket: 'Ticket') -> 'User' | None:
# Локальный импорт для реального использования объекта
from app.models import User
user = User.query.get(ticket.reporter_id)
return user
3. Стандарты качества кода
3.1. Линтинг и форматирование
- Линтер и форматирование: проект использует Ruff с конфигурацией из
pyproject.toml. Проверка всего репозитория:.venv/bin/ruff check .. - Типизация: стабильная типизированная граница проверяется командой
bash scripts/typecheck.sh. - Pre-commit: локальные хуки повторяют основной quality gate. Установите их командой
.venv/bin/pre-commit install.
3.2. Обработка предупреждений Ruff
F401(unused import): Удаляйте неиспользуемые импорты. Если импорт нужен дляTYPE_CHECKING, добавьте в конце строки комментарий# noqa: F401.E501(line too long): разбивайте выражение на читаемые строки в пределах настроенного лимита.F821(undefined name): Эта ошибка почти всегда указывает на нарушение правила о направлении зависимостей. Убедитесь, что вы добавили локальный импорт внутри функции, которая использует данный объект.