Скорректирован сценарий запуска, исправление бага с предметом

This commit is contained in:
2026-10-07 15:17:37 +03:00
parent 34b975da69
commit d897601d88
7 changed files with 131 additions and 9 deletions

View File

@@ -6,9 +6,11 @@ API и отображается на фронте.
## Быстрый старт
Нужен только Python 3.11+ и публичная ссылка на таблицу.
Нужны Python 3.11+, bash (Linux, macOS или WSL на Windows) и публичная ссылка
на таблицу.
```bash
python3 --version # должен быть 3.11 или новее
cp .env.example .env # в SCHEDULE_LINK вписать публичную ссылку Я.Диска
make run # создаст .venv, поставит зависимости и запустит оба сервиса
```
@@ -22,7 +24,7 @@ make run # создаст .venv, поставит зависим
Яндекс.Диск (xlsx)
│ скачивание по публичной ссылке
▼
api (FastAPI), порт 8000, доступ только с localhost
api (FastAPI), порт 8000, наружу — только 127.0.0.1 (в docker так публикуется порт)
• скачивает и разбирает xlsx без сторонних библиотек
• кэш в памяти: TTL + проверка даты изменения файла + stale-while-error
• один воркер, поэтому кэш общий
@@ -79,7 +81,10 @@ nginx (https://schedule.our-place.ru) → 127.0.0.1:8090
В одной ячейке может быть несколько занятий: они разделяются пустой строкой,
новым маркером «к.в.» или началом нового предмета сразу после строки
аудитории/преподавателя.
аудитории/преподавателя. Если пустой строкой (или красной заметкой, снятой с
целой строки) от предмета оторвался только преподаватель и/или аудитория, этот
кусок достраивает предыдущее занятие, а не создаёт занятие без предмета — иначе
в расписании аудитории оставались бы одни группы.
Итог по паре: `{time, ч: {raw, lessons[]}, з: {raw, lessons[]}}`, где
`lesson = {marker, subject, teacher, room, note}`.
@@ -200,11 +205,28 @@ tests/
| python-dotenv | 1.2.3 | чтение `.env` |
| requests | 2.34.2 | скачивание файла с Яндекс.Диска и прокси к API |
| pytest | 9.1.1 | тесты (`make test`) — только dev |
| httpx2 | 2.12.0 | HTTP-клиент для `TestClient` в тестах — только dev |
| httpx2 | 2.12.0 | HTTP-клиент (наследник httpx) для `TestClient` в тестах — только dev |
Ничего, кроме этого, не нужно: xlsx разбирается стандартной библиотекой
(`zipfile` + `xml.etree`), базы данных нет, кэш — в памяти процесса.
**Если установка не идёт**
- Проверьте `python3 --version`: нужен 3.11 или новее. Если в системе под
`python3` скрывается старая версия (например, 3.6 на старых CentOS), создайте
окружение нужной версией явно: `python3.12 -m venv .venv`.
- Debian/Ubuntu: если `make venv` падает на создании окружения, доставьте
пакет venv: `sudo apt install python3-venv` (для нестандартной версии —
например, `python3.12-venv`).
- `httpx2` и `httpcore2` — новые пакеты (август 2026, httpx перешёл под
опеку Pydantic и был переименован). Если pip берёт пакеты из корпоративного
зеркала или старого индекса, этих пакетов там может ещё не быть; проверьте
установку напрямую: `pip install -r requirements-dev.txt -i https://pypi.org/simple`.
В коде и тестах модуль импортируется как `httpx2`; `import httpx` больше
не работает. В рабочем коде httpx2 не используется — нужен только тестам.
- Makefile написан под bash: Linux, macOS или WSL. На Windows без WSL
используйте Docker-вариант из раздела «В Docker».
## Запуск
### Без Docker
@@ -221,8 +243,8 @@ make run # = make venv + запуск api и сайта
- API — <http://127.0.0.1:8000> (например, `/status` и `/groups`);
- сайт — <http://127.0.0.1:8080> (его и открывать в браузере).
Остановить — `Ctrl+C`. Данные тянутся из интернета при первом запросе
(скачивание занимает несколько секунд), дальше обновляются по интервалу.
Остановить — `Ctrl+C`. Данные скачиваются сразу на старте приложения
(скачивание занимает несколько секунд) и дальше обновляются по интервалу.
Полезные команды (`make help` — весь список):
@@ -255,5 +277,5 @@ cp .env.example .env # вписать SCHEDULE_LINK (и порты при
### Тесты
```bash
make test # 114 тестов, сеть не нужна
make test # 121 тест, сеть не нужна
```