6.8 KiB
Проверка FastAPI-версии — 2026-10-01
Рабочий проект: P:\Coding\Python\NetologyWebParserSite.
Архитектура
Rio полностью удалён из кода приложения, pyproject.toml и uv.lock. Сервер — FastAPI; страницы — Jinja2, HTML и CSS; интерактивность — небольшие JavaScript-модули с HTTP-запросами. WebSocket не используется.
Кабинет поддерживает импорт CSV/JSON/JSONL, выбор вложенного массива JSON, настройку четырёх представлений, живой предпросмотр, сохранение черновика, публикацию и снятие версии. Обычные учебные страницы используют ссылочную пагинацию. Динамические страницы отдают первую порцию данных в HTML и поддерживают дозагрузку через JavaScript.
Хранилище SQLite, формат публикаций, учётные данные и адреса опубликованных страниц сохранены. Тесты работают с изолированными данными; рабочий .env не изменялся. Отдельно от тестов исправлен найденный черновик с точным содержимым примера questionnaires.json: две записи участников и автоматически настроенные анкеты. Прежний черновик сохранён в data/backups/b2cce4ed61034aaab20242c364c21924-revision-3.json; опубликованные версии и исходный файл не изменены.
Результаты
uv sync --locked: зависимости установлены, Rio отсутствует.- Полный pytest с
LAB_BROWSER_TESTS=1,PLAYWRIGHT_CHANNEL=chrome: 49 passed, в том числе 14 реальных браузерных сценариев; 27,97 секунды. - Один сторонний warning: Starlette предупреждает о будущем переходе TestClient с httpx на httpx2. Ошибок тестов нет.
- Импорт, предпросмотр, публикация, конфликт ревизий, замена исходника без изменения опубликованной версии, авторизация и CSRF проверены HTTP-тестами.
- Браузер проверяет импорт CSV и вложенного JSON, настройку заполненных анкет, блокировку сохранения после неуспешной проверки файла, изменение подписей в предпросмотре и предупреждение о несохранённых изменениях.
- Все четыре представления проверены парсерами и Chrome: 51 запись, дозагрузка, поиск, фильтры, отсутствие скрытых полей в публичных данных.
- Переход «Parser Lab / Коллекции» и выход из кабинета проверены.
- Единый favicon проверен на главной, входе, в кабинете и обоих типах учебных страниц.
- Одинаковые размеры, шрифты, цвета и положение элементов обычной/динамической страницы проверены на ширине 1440 и 390 пикселей.
- Снимки реального интерфейса кабинета и четырёх форматов проверены на настольном и мобильном экранах. Горизонтальная прокрутка широких таблиц остаётся внутри таблицы.
uv build: собраны sdist и wheel с HTML/CSS/JS, шрифтами и favicon.- Отдельное окружение
uv sync --locked --no-dev --no-editable: установлен 21 пакет. Запуск установленного пакета, healthz, главная, вход, перенаправление из закрытого кабинета и статические ресурсы проверены без Rio и pytest.
Все проверки выполнялись на временных данных. Тестовые серверы остановлены.
Запуск
Из корня проекта:
uv sync --locked
uv run --locked --env-file .env python -m parser_lab
Если предыдущая версия ещё запущена, остановите её перед запуском новой. Повторно создавать .env и импортировать существующие данные не нужно.
Dockerfile и Compose сохранены. Сборка и запуск самого контейнера в этой среде не проверены, поскольку Docker недоступен. Проверена отдельная production-установка с теми же uv-зависимостями.
design-spec.md и implementation-plan.md помечены как архив первоначальной Rio-архитектуры. Актуальная инструкция — README.md.
Исправление импорта questionnaires.json
Браузерный сценарий загружает реальный examples/data/questionnaires.json, нажимает «Проверить файл» и «Сохранить и настроить», не выбирая вручную JSON-пути. Проверяются две анкеты A01/A02 и шесть исходных ответов: 8, Прогулка, true, 5, null, false. Импорт и редактор показывают отформатированные анкеты. Отдельный сценарий исправляет старый импорт целого документа кнопкой «Настроить анкеты автоматически», проверяет сохранение после перезагрузки и публикацию.
HTTP-проверки подтверждают независимость распознавания от имени файла, отказ от автоматического выбора при нескольких подходящих массивах, сохранение опубликованного снимка и исходника при исправлении, а также защиту от устаревшей ревизии. При неизвестной структуре остаётся ручной выбор полей.