Releases: nowherewashere/study-digest
Release list
study v1.7.0
Задание в ТУИС приходит из двух ручек, и раньше об этом знала только сводка: 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
Сводка перестала верить одному полю 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
Оценённая работа больше не числится несданной.
- Очную защиту Moodle оценивает без загруженного файла:
statusответа остаётсяnew, а оценка стоит — такая работа попадала в «просрочено» и «Горит». Теперь оценка приstatus="new"означает «сдано» — #2 от @Alstrr, с регрессионным тестом. - Отзыв, сохранённый без оценки, приходит с
grade = -1(ASSIGN_GRADE_NOT_SET): это не оценка — работа остаётся несданной,study taskбалл не показывает.
study v1.5.1
Проверка обновления не сдаётся после первого молчания GitHub.
study stateпроверяетoriginчерезgit fetch; раньше на это отводилось 8 с, и утренняя сводка из медленной сети получала строку «Не удалось: git · обновление study · fetch не удался: нет ответа за 8 с» — сама сводка при этом была полной, страдала только подсказка об обновлении. Теперь наfetch20 с и одна повторная попытка при молчании; если GitHub не ответил и так, строка остаётся честной: «нет ответа за 20 с, 2 попытки».
study v1.5.0
У курса появился профиль сдачи, карточка задания одной командой, в сводке — объявления и отзывы преподавателя.
- Профиль сдачи курса — строка
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
Сводка видит файлы из старых курсов и пересдачи, 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
Сводка устойчивее к сбоям, обновление показывает, что тянет, «Горит» вместо «Предлагаю начать».
- Повторы при сбоях сети: чтение из 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
Установка и настройка переехали с 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, на Windowsstudy.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
Тесты без сети и токенов для всех модулей, которые ходят наружу: 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
Релиз без оговорок: к коду 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.