Структура git-репозитория для практикума 2025 г. по Python

Регистрация

Гостевой аккаунт Standard guest "just once"

Репозиторий

  • Репозиторий должен быть публичный

  • Название репозитория может быть любым, структуру и именование каталогов с домашними заданиями см. ниже.
  • Всё, что вы сделали за время занятия, следует публиковать в этом репозитории в день занятия

  • Все решения и тесты должны быть опубликованы в репозитории до окончания дедлайна по заданию

Правила именования

  • Для каждого семинара создается каталог с именем вида <ГГГГММДД> (выдача команды date "+%Y%m%d"), дата - того семинара, на котором выдано задание.

  • Все программы, {i} написанные во время занятия, записываются в каталог <ГГГГММДД>/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

Работа с ветками во втором семестре

  • Все задания во втором семестре выполняются на ветке с именем «work» (маленькими буквами); задание может включать в себя другие ветки

  • TODO как сделать work веткой по умолчанию

Кросс-тестирование

  1. Подготавливаем окружение (необязательно, но практика показала, что так меньше ошибок)
    python3 -m venv crosstest
    cd crosstest
    source bin/activate          # Вариант для Linux / MacOS
    Scripts\activate        # Вариант для windows
    pip install путь_до_hworker.whl
    • Для того, чтобы возобновить работу в окружении после выхода из него, надо вновь войти в каталог окружения и запустить activate

  2. <!> В некоторых случаях стартовый сценарий в командной строке не виден, тогда вместо hworker надо писать python -m hworker

  3. Быстрая проверка, что HWorker запускается:
    • hworker -s -c update

      • Это тестовый пример, он заводится в подкаталоге sample

      • Он выдаст журнал проверок
    • можно даже запустить hworker -s -c update -c publish, но не обязательно ☹

  4. Выберите себе напарника из числа участвующих в вашем практикуме (публикатор на grep.cs.msu.ru)

  5. Подготовка HWorker к кросс-тестированию
    • Скачиваем конфигурационный файл и кладём в тот же каталог
    • Вписываем в этот файл себя и напарника
      • Имя — строго как в публикаторе на grep.cs.msu.ru

      • Репозиторий — строго в формате https://… (не git@git:…). Проверьте, что этот репозиторий доступен публично и его можно склонировать.

  6. Проверяем, что HWorker работает в режиме полной проверки:
    • hworker путь-до/personal….toml -c update

    • Ошибок быть не должно
  7. Заходим в свой репозиторий. Подкладываем в подкаталог check (рядом с файлами-тестами) всех задач (кроме №0 — классных работ, и задач, относительно которых отмечено, что кросс-тестов по ним не надо) файл remote с описанием тестов, которые написали не вы. Формат файла:

    [remote]
    "Напарник:20241008/2/1" = []
    "Напарник:20241008/2/2" = []
    "Напарник:20241008/2/3" = []
    
    • Напарник — ID напарника, 20241008/2 — ID задачи, 01 — имя файла без расширения .in/.out

    • {i} Для быстрого заполнения репозиториев можно воспользоваться 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 в репозиторий

  8. Выполняем кросс-тестирование этой задачи той же командой (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 #!/bin/bash
      11 
      12 DATES=$(grep '^deliver_ID = "' "$TOML_PATH" | \
      13           sed -n 's|^deliver_ID = "\([^/]*\)/1"|\1|p' | \
      14           tr '\n' ' ' | \
      15           sed 's/ $//')
      16 
      17 for id in "$ST_A" "$ST_B"; do
      18   for user_id in "$ST_A" "$ST_B"; do
      19     result=$(grep "ID=${id}.*USER_ID=${user_id}" test_data | head -n 1)
      20     if [ -n "$result" ]; then
      21       echo "$result"
      22     else
      23       echo "Проверки тестов ${id} на задачах ${user_id} не было"
      24     fi
      25   done
      26 done
      27 
      28 result = $(grep "rating=0\.0" test_data)
      29 if [ -n "$result" ]; then
      30   echo "Ошибки в тестировании:"
      31   echo $result
      32 else
      33   echo "Ошибки в тестировании отсутствуют"
      34 fi
    

LecturesCMC/PythonDevelopment2025/Prac/RepoStruct (последним исправлял пользователь FrBrGeorge 2025-05-26 10:54:55)