Проект генерирует персонализированные варианты лабораторных работ по программированию и проверочные тесты для них.
Сейчас реализованы 6 из 6 лабораторных работ:
lab1- набор подзадач на обработку массива;lab2- многофайловый C-проект с pipeline из step/core функций;lab3- обработка текста и предложений;lab4- обзор стандартной библиотеки C и работа со строками;lab5- работа с регулярными выражениями;lab6- работа с динамическим списком.
Для запуска через Docker нужно установить:
git;- Docker 24 или новее.
Для локального запуска без Docker нужно установить:
- Python 3.12;
pip;gccиmakeдля проверок C-решений.
Все команды ниже выполняются из корня репозитория mse1h2026-lab-gen.
Скопируйте и выполните команды:
git clone https://github.com/moevm/mse1h2026-lab-gen.git
cd mse1h2026-lab-gen
docker build -t mse-lab-gen .
docker run --rm -it mse-lab-genПосмотреть доступные команды внутри контейнера:
python main.py -hПроверить корректность запуска:
python main.py lab1 --seed smoke-seed --mode=init
python main.py lab6 --seed smoke-seed --mode=dry-runОжидаемый результат: команды завершаются без Traceback, выводят текст задания или JSON с полем assignment.
git clone https://github.com/moevm/mse1h2026-lab-gen.git
cd mse1h2026-lab-gen
python -m pip install -e ".[test]"
labgen --helpСтарый запуск через python main.py ... также поддерживается.
Проект можно установить как Python-зависимость из GitHub без установки git в образ:
RUN pip install https://github.com/moevm/mse1h2026-lab-gen/archive/refs/heads/main.zipЕсли в образе уже есть git, можно использовать git+https:
RUN pip install git+https://github.com/moevm/mse1h2026-lab-gen.git@mainПосле установки в образе будет доступна команда labgen:
labgen lab1 --seed Басыров --mode=init
labgen lab4 --seed Басыров --mode=check --solution=solution.cПоказать параметры конкретной лабораторной:
python main.py lab1 -h
labgen lab6 -hСгенерировать вариант:
python main.py lab1 --seed Басыров --mode=init
python main.py lab2 --seed Басыров --mode=init
python main.py lab3 --seed Басыров --mode=init
python main.py lab4 --seed Басыров --mode=init
python main.py lab5 --seed Басыров --mode=init
python main.py lab6 --seed Басыров --mode=initВывести задание вместе со сгенерированными тестами:
python main.py lab4 --seed Басыров --mode=dry-run
python main.py lab6 --seed Басыров --mode=dry-runПроверить решение:
python main.py lab1 --seed Басыров --mode=check --solution=./examples/lab1_solution_good.c
python main.py lab5 --seed test123 --mode=check --solution=./examples/lab5_solution_good.c
python main.py lab6 --seed test_student --mode=check --solution=./examples/lab6_solution_good.cДля ЛР1 поддержана опция случайного выбора основания системы счисления для чисел на входе и выходе (от 10 до 234):
python main.py lab1 --seed Басыров --mode=init --random-base --base-min 10 --base-max 234Для ЛР2 поддержана проверка текстового blob-файла:
python -m prog_labgen.lab2.lab2_cli --blob-file ./examples/lab2_solution_good.txt --seed example-lab2 --mode=checkВ проекте есть несколько уровней автоматизированных проверок:
pytest- smoke-тесты CLI и unit-тесты отдельных лабораторных;scripts/run_example_checks.py- интеграционная проверка good/bad эталонных решений для ЛР1-ЛР6;scripts/stress_generate_variants.py- массовая проверка генерации вариантов на наборе seed-ов;- GitHub Actions - запуск тестов, интеграционных проверок, stress-проверки и Docker-сценариев на
pushиpull_request.
Локальный запуск:
python -m pip install -e ".[test]"
python -m pytest
python scripts/run_example_checks.py
python scripts/stress_generate_variants.py --count 25Запуск внутри Docker-контейнера:
python -m pytest
python scripts/run_example_checks.py
python scripts/stress_generate_variants.py --runner labgen --count 25Запуск одной командой через Docker без ручного входа в контейнер:
docker run --rm mse-lab-gen -lc "python -m pytest && python scripts/run_example_checks.py && python scripts/stress_generate_variants.py --runner labgen --count 25"Stress-проверка нужна, чтобы будущие изменения не выдавали студентам сломанные варианты. Скрипт запускает init и dry-run для каждой лабораторной на фиксированных seed-ах из scripts/seed_to_check.txt и на синтетических seed-ах вида ci-seed-0000.
Проверяется:
- команда завершилась с кодом
0; - вывод не пустой;
- в выводе нет
Traceback; - в выводе нет
None,TODO,<undefined>; - повторный запуск с тем же seed дает тот же результат;
- на наборе seed-ов для каждой лабораторной появляется больше одного варианта;
- если
dry-runвыводит JSON, он валиден и содержитassignment; - если в JSON есть
tests, каждый тест содержит входные данные иexpected_stdout.
Пример запуска:
python scripts/stress_generate_variants.py --labs lab1 lab2 lab3 lab4 lab5 lab6 --count 100При ошибке скрипт печатает команду для воспроизведения:
FAILED
lab=lab3
seed=ci-1842
mode=dry-run
Reproduce:
python main.py lab3 --seed ci-1842 --mode=dry-run
В .github/workflows/tests.yml настроен быстрый CI для push и pull_request.
Он проверяет:
- установку проекта как пакета через
pip install -e ".[test]"; - запуск установленной команды
labgenиз директории вне репозитория; - обратную совместимость
python main.py ...; helpдля ЛР1-ЛР6 черезlabgenиpython main.py;pytest;- good/bad эталонные решения для ЛР1-ЛР6;
- малый seed stress;
- сборку Docker-образа;
- запуск
labgen,python main.py,pytest, good/bad checks и stress внутри Docker.
В .github/workflows/stress.yml настроен тяжелый ручной stress-прогон:
python scripts/stress_generate_variants.py --runner labgen --count 1000Он нужен для поиска редких падений генератора на большом количестве seed-ов и не блокирует каждый pull request.
Материалы по итерациям и концепции лабораторных находятся в ветке reports:
docs/specification.md- спецификация требований;docs/lab1_concept.md- концепция ЛР1;docs/lab2_concept.md- концепция ЛР2;docs/lab3_concept.md- концепция ЛР3;docs/lab4_concept.md- концепция ЛР4;docs/lab5_concept.md- концепция ЛР5;docs/lab6_concept.md- концепция ЛР6;docs/iteration_*.pdf- презентации по итерациям;reports.md- ссылки на материалы по итерациям.