Skip to content

Stepik Python Grader v1.0.0 — Stable Release

Choose a tag to compare

@ArtVsMark ArtVsMark released this 24 Jun 16:21

🚀 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 / Applicationdownloader.py, grader.py, diagnostik_stepik.py
  • Infrastructurestepik_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).