Stepik Python Grader v1.0.0 — Stable Release
🚀 Stepik Python Grader v1.0.0 — Stable Release
Первый стабильный релиз. Полный рефакторинг с нуля: переименование модулей, OAuth-фасад, rich-вывод, 260 тестов, CI на Python 3.11–3.14.
Локальный грейдер для курсов «Поколение Python» на Stepik: скачивает данные задачи с сайта и позволяет не только проверить решение локально, но и сравнить несколько решений более честно — сначала по корректности, затем по benchmark-метрикам.
✨ Ключевые возможности
- 4 режима работы: одиночный тест / все тесты в папке / subprocess-бенчмарк / timeit-микробенчмарк
- Вердикты AC / WA / TLE / RE с подсветкой через
rich - OAuth 2.0 авторизация для скачивания тестов со Stepik (browser-flow + refresh-токены)
- Автоизвлечение тест-кейсов из HTML-таблицы и ZIP-архивов в тексте задачи
- Поддержка 3 репозиториев с тестами
python-generation: Professional, OOP, Samurai - Прогресс-бары и цветные таблицы результатов, diff при WA
- Профили нагрузки (low / medium / high / custom) и оценка по median, а не по одиночному замеру
🏗️ Архитектура
Слоистая структура, граф зависимостей — DAG без циклов:
- Domain / Application —
downloader.py,grader.py,diagnostik_stepik.py - Infrastructure —
stepik_client.py(OAuth2 + HTTP),executor.py(compile + exec с таймаутом),microbench_runner.py(timeit через subprocess),oauth_flow.py(OAuth-фасад) - Infrastructure / Utilities (leaf, без project-зависимостей) —
storage.py(JSON I/O),normalizers.py(нормализация вывода)
oauth_flow.py — единая точка входа для авторизации, устраняет дублирование load_secrets между downloader.py и diagnostik_stepik.py. Ребро downloader.py → grader.py сделано локальным импортом внутри функции, чтобы не нарушать слоистость и избежать циклов.
🔧 Что изменилось (основные изменения)
Рефакторинг
- Переименование модулей:
at_first.py → downloader.py,test.py → grader.py(полная замена, 16 файлов) - Создан
oauth_flow.py— unified OAuth facade, устранено дублированиеload_secrets grader.pyимпортируетrun_microbenchизmicrobench_runner.pyи_normalize_output_lineизnormalizers.py- Удалены мёртвые функции, убран
chardet,StepikTasks/добавлен в.gitignore
Тесты
- 260 тестов (pytest, 0 failures)
- OAuth safety net:
load_secrets,token_is_valid,wait_for_auth_code,OAuthHandler - Покрытие
oauth_flow.pyдоведено до 100% - 45+ тестов для
run_microbench,normalizers,_is_python_code_block,load_test_cases
CI/CD
- GitHub Actions workflow:
pytest+ruffна Python 3.11 / 3.12 / 3.13 / 3.14 (3.14 — experimental) - Консолидация workflow'ов: удалены дублирующие
lint.ymlиtest.yml, остался единыйci.yml - Bump
ruffдо 0.15.19
Документация
- Полный README: дерево файлов, DAG зависимостей, таблица модулей, режимы работы, конфигурация
- CHANGELOG, бейджи (CI, version, coverage, Python)
- Строгий README review — 11 исправлений; Issue #1 closed
Исправления
grader.py: fallback-стабы дляConsole/Table/Text, инициализацияmem_thread, удаление неиспользуемых переменных- Режимы меню 2/3/4: per-solution
test_dir,run_benchmark, function-mode для микробенчмарка - Audit fixes для rich-вывода и вердиктов
📊 Статистика
- Тестов: 260 (pytest, 0 failures)
- Python: 3.11 | 3.12 | 3.13 | 3.14
- Линтер: ruff (профиль E, F, W, I, UP, B, S102) — clean
- Coverage: 59%
🚀 Быстрый старт
git clone https://github.com/ArtVsMark/Stepik-Python-Grader.git
cd Stepik-Python-Grader
# Виртуальное окружение
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Зависимости
pip install -r requirements.txt # для разработки: pip install -e ".[dev]"
# Запуск грейдера
python grader.pyПри запуске появится меню с выбором режима [0–4]. Для скачивания данных задачи со Stepik настройте OAuth-приложение и secrets.json, затем запустите python downloader.py (подробности — в README).