Структура git-репозитория для практикума 2024 г. по Python
Регистрация
После создания репозитория его следует зарегистрировать здесь: https://git.cs.msu.ru/gkuryachiy/prac/-/issues/8
- Если у вас не аккаунта на git.cs.msu.ru, используйте гостевой
- Указать ФИО и группу
Репозиторий
Репозиторий должен быть публичный
- Название репозитория может быть любым, структуру и именование каталогов с домашними заданиями см. ниже.
Всё, что вы сделали за время занятия, следует публиковать в этом репозитории в день занятия
Все решения и тесты должны быть опубликованы в репозитории до окончания дедлайна по заданию
Правила именования
Для каждого семинара создается каталог с именем вида <ГГГГММДД> (выдача команды date "+%Y%m%d"), дата - того семинара, на котором выдано задание.
Все программы,
написанные во время занятия, записываются в каталог <ГГГГММДД>/0 Для каждого задания создаются подкаталоги <ГГГГММДД>/1, <ГГГГММДД>/2 и т. д.
В подкаталоге содержатся:
ровно один .py-файл с текстом решения, имя файла должно быть prog.py
исключение: задания, в которых явно требуется наличие нескольких .py-файлов. В таком случае задание оформляется в виде набора модулей, каждый из которых располагается в каталоге src/имя_модуля и запускается из каталога src командой python3 -m имя_модуля.
подкаталог check/, в котором хранятся примеры входных данных и эталонного вывода (если нужны по заданию).
Подсистема проверки домашних заданий
hworker-0.9.7-py3-none-any.whl
скачиваем, делаем pip install /путь/куда/скачали/hworker-0.9.7-py3-none-any.whl (Python 3.12+)
(вариант: pip3 install)
Если дистрибутив артачится и не хочет ставить, использовать изолированное окружение:
python3 -m venv отдельный_каталог; cd отдельный_каталог; source bin/activate
- вот оттуда уже заработает; оттуда и запускать
- Персональный запуск (не для кросс-тестирования):
hworker -p из каталога с решением или hworker -p каталог-с решением
например, hworker -p pythonprac/20231017/1
Пример:
20210903/1
prog.py
check/
1.in
1.out
2.in
2.out
- …
Как написать тест на класс/функцию?
- К файлу с классом/функцией необходимо приписать тестирующий код
В файл с тестом (1.in) кладётся программа на питоне, в которой используется тестируемый класс или функция
В файл с эталонным выводом попадает результат этого print()
Пример:
prog.py
check/1.in
print(C().A+42-C().fun(33))
check/1.out
9
Кросс-тестирование
- Подготавливаем окружение (необязательно, но практика показала, что так меньше ошибок)
python3 -m venv crosstest cd crosstest source bin/activate # Вариант для Linux / MacOS Scripts\activate # Вариант для windows pip install путь_до_hworker.whl
Для того, чтобы возобновить работу в окружении после выхода из него, надо вновь войти в каталог окружения и запустить activate
В некоторых случаях стартовый сценарий в командной строке не виден, тогда вместо hworker надо писать python -m hworker - Быстрая проверка, что HWorker запускается:
hworker -s -c update
Это тестовый пример, он заводится в подкаталоге sample
- Он выдаст журнал проверок
можно даже запустить hworker -s -c update -c publish, но не обязательно ☹
Выберите себе напарника из числа участвующих в вашем практикуме (публикатор на grep.cs.msu.ru)
- Подготовка HWorker к кросс-тестированию
- Скачиваем конфигурационный файл и кладём в тот же каталог
personal.toml — для основной группы
personal2.toml — для второй группы, если она есть
- Вписываем в этот файл себя и напарника
Имя — строго как в публикаторе на grep.cs.msu.ru
Репозиторий — строго в формате https://… (не git@git:…). Проверьте, что этот репозиторий доступен публично и его можно склонировать.
- Скачиваем конфигурационный файл и кладём в тот же каталог
- Проверяем, что HWorker работает в режиме полной проверки:
hworker путь-до/personal….toml -c update
- Ошибок быть не должно
Заходим в свой репозиторий. Подкладываем в подкаталог check (рядом с файлами-тестами) всех задач (кроме №0 — классных работ, и задач, относительно которых отмечено, что кросс-тестов по ним не надо) файл remote с описанием тестов, которые написали не вы. Формат файла:
[remote] "Напарник:20241008/2/1" = [] "Напарник:20241008/2/2" = [] "Напарник:20241008/2/3" = [] …
Напарник — ID напарника, 20241008/2 — ID задачи, 01 — имя файла без расширения .in/.out
Для быстрого заполнения репозиториев можно воспользоваться Shell-сценарием:
1 #!/usr/bin/env bash 2 # запускать из корневой директории вашего гит-репозитория 3 HIM="Иван Иванов" # имя вашего напарника 4 BASE_DIR=$(pwd) 5 find "$BASE_DIR" -type d -name "check" | grep "2025" | while read -r CHECK_DIR; do 6 FILE_PATH="$CHECK_DIR/remote" 7 RELATIVE_PATH=$(realpath --relative-to="$BASE_DIR" "$CHECK_DIR" | sed 's|/check$||') 8 cat << EOF > "$FILE_PATH" 9 [remote] 10 "$HIM:$RELATIVE_PATH/1" = [] 11 "$HIM:$RELATIVE_PATH/2" = [] 12 "$HIM:$RELATIVE_PATH/3" = [] 13 EOF 14 15 echo "Файл создан: $FILE_PATH" 16 done
Пушим файлы */*/remote в репозиторий
Выполняем кросс-тестирование этой задачи той же командой (update).
Посмотреть результаты можно командой hworker путь-до/personal.toml -c "show result"
Ключевое слово для поиска — "rating = …". В идеале должно быть 1.0
- Должны быть тесты как свои на своих задачах, так и свои на задачах соседа (и наоборот). Для быстрой проверки этого снова Shell-сценарий:
1 #!/usr/bin/env bash 2 3 ST_A="Иванов Иван" 4 ST_B="Петров Пётр" 5 TOML_PATH="/path/to/personal.toml" 6 7 hworker $TOML_PATH -c update 8 hworker $TOML_PATH -c "show result" > test_data 9 10 cat test_data | grep "ID=${ST_A}.*USER_ID=${ST_A}" | head -n 1 || echo "Проверки тестов $ST_A на задачах $ST_A не было" 11 cat test_data | grep "ID=${ST_A}.*USER_ID=${ST_B}" | head -n 1 || echo "Проверки тестов $ST_B на задачах $ST_A не было" 12 cat test_data | grep "ID=${ST_B}.*USER_ID=${ST_A}" | head -n 1 || echo "Проверки тестов $ST_A на задачах $ST_B не было" 13 cat test_data | grep "ID=${ST_B}.*USER_ID=${ST_B}" | head -n 1 || echo "Проверки тестов $ST_B на задачах $ST_B не было"
