Skip to content

Releases: nowherewashere/study-digest

study v1.7.0

Choose a tag to compare

@nowherewashere nowherewashere released this 22 Sep 14:18

Задание в ТУИС приходит из двух ручек, и раньше об этом знала только сводка: mod_assign_get_assignments отдаёт всё про приём ответа, но молчит о заданиях с ограничением доступа, а core_course_get_contents отдаёт их без данных о сдаче. Теперь слияние вынесено в реестр, и одно и то же задание везде видно одинаково.

  • Реестр заданий (study/assigns.py): works() сливает источники по cmid, find() ищет по номеру работы, id и cmid, modules() отдаёт прочие элементы со сроком. На нём стоят сводка, study task, study assigns и предполёт study submit.
  • study task <код> <NN|id|cmid> открывает и задание, закрытое ограничением доступа: срок, описание модуля и причина из ТУИС («Вы принадлежите к группе …») вместо «в курсе нет задания». Принимает cmid — тот самый номер, которым задание называет сводка.
  • study assigns --course <код> печатает такие задания строками (cmid, срок, причина) вместо счётчика «Скрыто ограничением доступа: N»; без курса поведение прежнее — состав пришлось бы спрашивать по каждому курсу. Курс, который в ТУИС ничего не принимает, так и говорит.
  • study submit с id, которого нет в mod_assign (часто это cmid из сводки), отказывает сразу и объясняет почему — раньше шёл за статусом и получал невнятную ошибку Moodle.
  • Сводка не изменилась ни на строку, но теперь стоит на реестре; порядок сроков стал детерминированным: срок → курс → название, а не «как ответил ТУИС».
  • Курс без папки больше не молчит: строка «Без папки (файлы не скачиваются): … — CODE <id> <папка> или COURSE_IGNORE» держится в каждой сводке, пока курс не заведён или не в игноре. Объявление «Новый курс в ТУИС» бывает один раз, и его легко пропустить.
  • Имена работ: «Решение задачи 3 ИДЗ» → «Задача 3» в таблицах, поиск по номеру работает и для них.
  • Сбой состава курса больше не уносит список и не молчит в карточке: ошибка мягкая и печатается строкой «Не удалось: …», как в сводке.

Внутри: soft переехал в config, lab_number — в fmt, KINDS/DATE_IDS/SUBMISSION — в assigns. Тестов 176, CI зелёный на 3.8 и 3.12 под Linux, macOS и Windows.

study v1.6.0

Choose a tag to compare

@nowherewashere nowherewashere released this 20 Sep 23:46

Сводка перестала верить одному полю Moodle: состояние ответа считается по всем, study submit проверяет себя до отправки, а отказ сервера больше не выглядит как «Отправлено».

  • Одна функция знает семантику состояния — submission_state(): ею пользуются сводка, study task и study submit. Учтено: оценка без файла (#2), групповой ответ (teamsubmission), задание без ответа в ТУИС (очное — offline), индивидуальное продление срока (extensionduedate заменяет срок и поднимает cutoff), «приём ещё не открыт» (allowsubmissionsfromdate) и «приём закрыт» — по lastattempt.canedit, серверному признаку (cutoff, продление, блокировка, истёкшая запись), а не по дате.
  • «Приём закрыт» ≠ «просрочено». У 42 из 43 заданий РУДН cutoffdate == duedate: после срока ТУИС ответ не примет, сдаётся только «Пересдача …». Такая работа остаётся в «Сроках» как «приём закрыт», а в «Горит» идёт пересдача. «Заблокировано», «откроется DD.MM», «очно / без ответа в ТУИС» — новые подписи; продлённая работа переезжает из просроченного в сроки, снимок хранит исходный срок.
  • study submit спрашивает состояние ответа и отказывает до отправки: приём закрыт, заблокировано, уже оценено, ответ отправлен и правка закрыта, приём ещё не открыт, очное задание. План показывает состояние и что будет после сохранения; при submissiondrafts=1 черновик тут же сдаётся mod_assign_submit_for_grading (с подтверждением авторства при requiresubmissionstatement).
  • Отказ Moodle — ошибка. Ручки записи отвечают HTTP 200 и списком warnings; раньше «Отправлено» печаталось и тогда. Теперь это StudyError с причиной из item («The due date for this assignment has now passed») и code=warningcode.
  • Выбор темы считает только открытые варианты (disabled — заполненные); тест с timeopen в будущем — «откроется DD.MM».
  • --json: у задания graded, closed, opens, canedit, locked; not_started — без закрытых к приёму и очных. Документация: docs/tuis-api.md — блок «Состояние ответа — не одно поле» (включая cansubmit — кнопка, а не признак; abandoned в лимите попыток; timeclose = 0 и задания без срока; скрытые оценки), AGENTS.md — грабля «приём закрыт», README — «Горит» и поля.

study v1.5.2

Choose a tag to compare

@nowherewashere nowherewashere released this 20 Sep 23:10

Оценённая работа больше не числится несданной.

  • Очную защиту Moodle оценивает без загруженного файла: status ответа остаётся new, а оценка стоит — такая работа попадала в «просрочено» и «Горит». Теперь оценка при status="new" означает «сдано» — #2 от @Alstrr, с регрессионным тестом.
  • Отзыв, сохранённый без оценки, приходит с grade = -1 (ASSIGN_GRADE_NOT_SET): это не оценка — работа остаётся несданной, study task балл не показывает.

study v1.5.1

Choose a tag to compare

@nowherewashere nowherewashere released this 20 Sep 16:41

Проверка обновления не сдаётся после первого молчания GitHub.

  • study state проверяет origin через git fetch; раньше на это отводилось 8 с, и утренняя сводка из медленной сети получала строку «Не удалось: git · обновление study · fetch не удался: нет ответа за 8 с» — сама сводка при этом была полной, страдала только подсказка об обновлении. Теперь на fetch 20 с и одна повторная попытка при молчании; если GitHub не ответил и так, строка остаётся честной: «нет ответа за 20 с, 2 попытки».

study v1.5.0

Choose a tag to compare

@nowherewashere nowherewashere released this 20 Sep 12:00

У курса появился профиль сдачи, карточка задания одной командой, в сводке — объявления и отзывы преподавателя.

  • Профиль сдачи курса — строка FLOW <id> release|file в config.env. release — репозиторий курса по регламенту преподавателя: git-flow, релиз с отчётом и презентацией на обоих хостингах, скринкасты, study answer, папка tuis/; file — отчёт файлом, работа в <код>/labNN/, сдача study submit --attach, репозиторий и хостинги не смотрятся. Без строки профиль угадывается по репозиторию в папке курса (study courses показывает его со знаком «?»); study courses --setup спрашивает и записывает. tuis/ больше не создаётся при настройке — её заводит study answer.
  • study answer <код> <NN> — только у release-курсов и только по лабораторным: домашние (hwNN) команда больше не принимает; у file-курса отказывает с подсказкой про submit --attach.
  • study task <код> <NN|id> — карточка задания без файлов: текст целиком, срок, что принимает (число, типы и размер файлов, текст), состояние ответа, балл и отзыв преподавателя, что уже есть на диске (у release — лаба репозитория с готовностью отчёта, презентации и видео; у file — <код>/labNN/ и собранные PDF), файлы stash/ с этим номером в имени. NN — лаба по номеру, иначе id из study assigns.
  • Отзыв преподавателя («Feedback comments») читается из состояния ответа: новые отзывы — разделом «Отзывы», работа, возвращённая на доработку (reopened), — в «Сроках» с началом отзыва и в «Горит» наравне с несданным.
  • Объявления — новые записи форумов объявлений курсов (type: news) разделом перед «Новым в курсах»; новизна по id против снимка, а не по дате. На старом Moodle клиент сам переключается на mod_forum_get_forum_discussions_paginated.
  • Ссылки курса (mod_url: онлайн-лекции и т. п.) видны в study files --all строкой «ссылка … → URL» и попадают в «Новое в курсах».
  • Документация: docs/AGENTS.md описывает папку курса через профиль, «Сдача работы» разделена по профилю, рецепт «разобрать задание» через study task, «нашли ошибку — issue/PR, локально не патчить»; в README — FLOW, study task, справочник полей --json, «Нашли ошибку». Из отгружаемых доков убраны имена реальных предметов.

study v1.4.0

Choose a tag to compare

@nowherewashere nowherewashere released this 20 Sep 01:06

Сводка видит файлы из старых курсов и пересдачи, submit проверяет себя перед отправкой, перезалитые методички перекачиваются.

  • «Новое в курсах» — по составу, а не по дате: снимок хранит состав курсов, и файл, скопированный преподавателем из прошлогоднего курса (с timemodified того года), теперь виден и в сводке, и в study files. core_course_get_updates_since такие файлы не показывает. Если состав курса не прочитался, прошлый список сохраняется — назавтра всё не станет «новым».
  • Пересдачи («Пересдача лабораторной работы № N») — не срок, пока лаба не просрочена и не сдана: в «Сроки», «Горит» и «новое задание» они не попадают, в --json есть retakes[] с retake_of и needed. Скрытые ограничением доступа пересдачи — по тому же правилу.
  • study files --pull перекачивает перезалитый в ТУИС файл поверх копии (отметки «есть, в ТУИС новее» и «обновлён», «скачано N, из них обновлено M»); копия ложится на место старой, в том числе в подкаталог, mtime = timemodified из ТУИС.
  • study submit: план показывает, что принимает задание (текст, число, типы и размер файлов — из configs), и отказывает при несовпадении даже с --confirm. --attach <файл>… проверяет вложения на диске и загружает их только при отправке; study upload → --files <itemid> остаётся.
  • Курс, появившийся в записи ТУИС (или выведенный из COURSE_IGNORE), объявляется строкой «Новый курс в ТУИС: …». study assigns --json отдаёт intro — текст задания.
  • study setup и study courses --setup кладут заготовку NOTES.md по курсу (готовый файл не трогают). В docs/AGENTS.md: что делать с NOTES.md при первом обращении к предмету, курс без репозитория, новые методички, раздел «Работа над самим инструментом», грабли про invalidtoken, пояс и пересдачи.
  • Windows: study state --since all больше не падает в fmt.moment (OSError 22 на первых часах эпохи) — #1 от @Paefremova; регрессионный тест гоняется в CI на windows-latest.

study v1.3.0

Choose a tag to compare

@nowherewashere nowherewashere released this 17 Sep 22:10

Сводка устойчивее к сбоям, обновление показывает, что тянет, «Горит» вместо «Предлагаю начать».

  • Повторы при сбоях сети: чтение из Moodle (кроме отправки ответа), загрузка файлов и список релизов повторяются до трёх раз с паузой 2 с при обрыве, таймауте и HTTP 502–504. Раздел, который так и не собрался, сводка перечисляет в конце строкой «Не удалось: …» — раньше такие ошибки были видны только в --json.
  • Снимок состояния и config.env пишутся через временный файл и os.replace; config.env создаётся сразу с правами 600. Повреждённый .state.json не роняет сводку: берётся последний целый дневной снимок из state/, без него — как первый запуск.
  • study update перед pull показывает коммиты, diff --stat и результат git verify-commit, в терминале спрашивает Обновить? [y/N]; без терминала нужен --yes, иначе печатается план и код возврата 1. --check показывает тот же план.
  • Раздел «Горит»: несданное, что просрочено или сдаётся в ближайшую неделю, — печатает сама программа. Промпт задачи (docs/daily-digest-prompt.md) больше не просит агента читать методички и дописывать план: вывод печатается как есть.
  • Курсы из COURSE_IGNORE в сводке не появляются нигде; раздел «Сроки в скрытых курсах» остался только для курсов, скрытых в самом ТУИС. Курс с выключенным показом оценок (nopermissiontoviewgrades) в «Баллах» молча пропускается.
  • README: коды возврата (0 / 1 план без подтверждения / 2 ошибка / 130), версия структуры schema в JSON у state и digest.

study v1.2.0

Choose a tag to compare

@nowherewashere nowherewashere released this 15 Sep 23:05

Установка и настройка переехали с bash на Python, инструмент работает на Linux, macOS и Windows.

  • install.py — установка: git и python3, вопрос о пути, клон, config.env из примера, затем study setup. Linux/macOS: curl -fsSL …/install.py -o install.py && python3 install.py; Windows: iwr …/install.py -OutFile install.py; py install.py. setup.sh — обёртка ради старой ссылки.
  • study setup — токены, каталоги, проверка Moodle, команда в PATH, ИИ-оператор, курсы; те же экраны [n/7] и итог, что у setup.sh; можно запускать снова.
  • Команда study в ~/.local/bin: симлинк на POSIX, на Windows study.cmd и sh-скрипт для Git Bash, PATH пользователя — с согласия.
  • Кроссплатформенность: UTF-8 у всех файлов и git, права 600 только на POSIX, UTF-8 и VT-режим консоли на Windows, подсказка про Install Certificates.command на macOS, имена файлов курсов без символов, запрещённых на Windows.
  • CI: ubuntu, macos, windows × Python 3.8 и 3.12; тесты study setup и install.py с подменёнными input/getpass.

study v1.1.0

Choose a tag to compare

@nowherewashere nowherewashere released this 15 Sep 21:23

Тесты без сети и токенов для всех модулей, которые ходят наружу: moodle, digest (сбор, эталонный markdown, снимок, state --pull), hosting (GitVerse, SourceCraft), rutube, files, answer, update.

  • tests/fakes.py — подмена net.send: очередь ответов по (метод, подстроки ключа) и запись отправленного; неподменённый вызов роняет тест.
  • tests/fixtures/ — минимальные ответы Moodle по форме из docs/tuis-api.md и эталон сводки digest.md.
  • Поведение инструмента не менялось.

study v1.0.1

Choose a tag to compare

@nowherewashere nowherewashere released this 15 Sep 20:54

Релиз без оговорок: к коду v1.0.0 добавлено то, что положено публичному репозиторию.

Добавлено

  • Лицензия MIT — теперь инструмент можно легально использовать, менять и форкать.
  • Тесты (tests/, только stdlib, python3 -m unittest): разбор названий заданий, чтение и запись config.env, токены, снимки состояния и --since, блок агента, подсказка об обновлении, разбор git-remote, multipart.
  • CI на GitHub Actions: тесты на Python 3.8 и 3.12, ruff, shellcheck — заявленная совместимость с 3.8 теперь проверяется, а не декларируется.

Исправлено

  • Строка «Обновление study: …» теперь действительно последняя в сводке — как и ждёт агент по инструкции.
  • study update в терминале с ssh-ключом под паролем снова спрашивает пароль: BatchMode включается только без терминала (задача по расписанию); пользовательский GIT_SSH_COMMAND не перекрывается.
  • --version зовёт git только по запросу, а не при каждой команде.

Обновиться: study update.