Releases: ArtVsMark/Stepik-Python-Grader
Release list
v1.6.0
What's Changed
- feat(glossary): link RE verdicts to Glossary-Python (#72, epic #96) by @ArtVsMark in #158
- chore(packaging): MIT LICENSE + py.typed (PR-1, #98/#100/#101) by @ArtVsMark in #159
- docs: split README into docs/ knowledge base (PR-2, #102) by @ArtVsMark in #160
- docs: split README into focused documentation by @ArtVsMark in #179
- docs: add configuration reference by @ArtVsMark in #180
- docs: specify web MVP UX and local UI architecture by @ArtVsMark in #181
- docs: remove stale release plan and trim contributing guide by @ArtVsMark in #182
- chore: derive package version from git tags by @ArtVsMark in #183
- docs: clarify versioning policy and prepare Claude handoff by @ArtVsMark in #184
- docs: clarify web MVP downloader, microbench, and glossary scope by @ArtVsMark in #185
- docs: fix microbench entrypoint references by @ArtVsMark in #188
- feat: add JSON glossary provider foundation by @ArtVsMark in #189
- docs: clean up markdown drift after glossary foundation by @ArtVsMark in #192
- docs: add glossary source-of-truth and security policy by @ArtVsMark in #203
- docs: sync changelog and Claude handoff before glossary work by @ArtVsMark in #205
- refactor(glossary): add origin/module/qualname to GlossaryMissingEntry by @ArtVsMark in #206
- feat(glossary): stdlib inventory scanner for official Python coverage by @ArtVsMark in #207
- feat(glossary): coverage report and missing JSON generator by @ArtVsMark in #208
- feat(glossary): CLI entrypoint for coverage scan by @ArtVsMark in #209
- feat(version): distinguish dev vs release in --version by @ArtVsMark in #210
- feat(ci): auto-update README coverage badge by @ArtVsMark in #211
- feat(ci): live current-version badge alongside Release by @ArtVsMark in #212
Full Changelog: v1.5.0...v1.6.0
v1.5.0
What's Changed
- Audit backlog cleanup: prlimit memory cap (#67) + remove unwired code (#69) by @ArtVsMark in #90
- feat(cache): opt-in result caching to skip unchanged solutions (#56) by @ArtVsMark in #91
- feat(pytest): run grader as a pytest plugin via --grader-mode (#57) by @ArtVsMark in #92
- feat(watch): incremental --mode 2 re-run via the #56 cache (#71) by @ArtVsMark in #93
- fix(ide): launch tasks via the editor interpreter + version consistency audit by @ArtVsMark in #94
- chore(release): prepare v1.5.0 by @ArtVsMark in #95
Full Changelog: v1.4.0...v1.5.0
v1.4.0
What's Changed
- docs(readme): PyPI install is live — pipx install stepik-python-grader (#70) by @ArtVsMark in #85
- feat(web): local web UI — stepik-grader --serve (epic #80 Tier 1, #58) by @ArtVsMark in #86
- feat(web): polish Web UI — benchmark mode, default path, localStorage, summary by @ArtVsMark in #87
- feat(ide): IDE integration — stepik-grader --init-vscode + PyCharm docs (Tier 2, #58) by @ArtVsMark in #88
- chore(release): prepare v1.4.0 — version bump + docs sync by @ArtVsMark in #89
Full Changelog: v1.3.0...v1.4.0
What's Changed
- docs(readme): PyPI install is live — pipx install stepik-python-grader (#70) by @ArtVsMark in #85
- feat(web): local web UI — stepik-grader --serve (epic #80 Tier 1, #58) by @ArtVsMark in #86
- feat(web): polish Web UI — benchmark mode, default path, localStorage, summary by @ArtVsMark in #87
- feat(ide): IDE integration — stepik-grader --init-vscode + PyCharm docs (Tier 2, #58) by @ArtVsMark in #88
- chore(release): prepare v1.4.0 — version bump + docs sync by @ArtVsMark in #89
Full Changelog: v1.3.0...v1.4.0
v1.3.0
What's Changed
- Onboarding UX: beginner-proof README + native file-dialog fallback (#79) by @ArtVsMark in #77
- docs/housekeeping: version-evolution comparison + fix stale root_dir in config example by @ArtVsMark in #81
- ci(release): PyPI trusted-publishing job (#70) — pivot from standalone .exe (#78) by @ArtVsMark in #82
- chore(release): prepare v1.3.0 — version bump + docs sync by @ArtVsMark in #84
Full Changelog: v1.2.0...v1.3.0
v1.2.0
What's Changed
- Audit v1.1.0 epic: Sprints A-E, #45 A-01, roadmap #53/#54/#58 by @ArtVsMark in #63
- Release v1.2.0 — UTF-8 stdio, python -m entry point, mode-4 Py-heap column, versioning docs by @ArtVsMark in #76
Full Changelog: v1.1.0...v1.2.0
Stepik Python Grader v1.1.0 — Sprint 6–8
What's Changed
- refactor: core/ restructuring, dedup, grader.py split, Sprints 6–8.1 by @ArtVsMark in #22
- Add claude GitHub actions 1783010684945 by @ArtVsMark in #40
- release: v1.1.0 — Sprint 6–8 backlog, src-layout, docs sync by @ArtVsMark in #41
- docs(claude): update Glossary-Python status (closes #38) by @ArtVsMark in #42
Full Changelog: v1.0.0...v1.1.0
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).