Skip to content

Автогенерация задач с сортировкой на основе TODO.md

Почему это требует внимания?

Я практически во всех своих проектах использую TODO.md для постановки задач и отслеживания прогресса.

Помощь при возвращении к проекту

Ведение подобных трекеров очень помогло мне вернутся даже к этому проекту. Несмотря на то, что последний коммит был около 8-ми месяцев назад, я смог беглым взглядом пройтись не по кодовой базе, а по собственному .md файлику, и сразу вспомнить что я делал, что не сделал, что хотел сделать. И бонусом - сразу же намечен план дальнейших действий.

Я стараюсь комментировать

Первая версия, которая пока что ушла на второй план

Изначально я думал получить генерацию вот такого вида:

Текущие задачи Выполено
Сделать выбор из списка веток, куда делать коммит для синхронизации Адаптировать скрипт format_all_md_files под новый pre-commit, потому что он отправляет в скрипт файлы как аргументы
Поправить чтобы бэк отдавал не имена файлов, а названия разделов как это указано в mkdocs.yml В синхронизации api\sync\sevice.py настроить пуши не в main, а в отдельную ветку, которую я потом буду мёржить с main веткой.
Сделать чтобы поддерживало пути по типу "FastAPI/Главная" Сделать докерфайл для сборки
Поправить переходики, чтобы оно шло прям по Категория/раздел/подраздел, сейчас это падает с ошибкой Добавить чекбокс, чтобы сделать заметку без кода
Сделать вкладку по типу inbox, для входящих но пока неотсортированных фрагментов Сделать функцию, которая отдаёт dict:
Сделать модалку с выгрузкой. Можно скачать как архив с документацией. Либо же добавить из выгрузки, чтобы всё само подтягивалось, создавались нужные разделы и подразделы. Написать статейку про приложение которое я написал, добавить ссылочки на них в readme отдельным блоком

По итогу не очень понравилось как это всё читается и организованно в целом, когда там довольно много записей и пунктов.

Я даже написал скрипт, который через библиотеку преобразует списки в форматированные таблички в таком формате:

from tabulate import tabulate

md_table = tabulate(data, headers=["Текущие задачи", "Выполнено"], tablefmt="github")

Более простой вариант списком мне показался более простым и понятным. Добавил сортировку на выполненные и текущие, чтобы было проще ориентироваться, и не сильно запариваться при форматировании.

Открыл для себя удобную функцию в itertools

В процессе поиска более элегантного решения, даже удалось познакомиться с

for u_task, c_task in zip_longest(uncompleted, completed, fillvalue=""):
        if u_task or c_task:
            result_table.append([u_task, c_task])

Позволила очень быстро привести списки к формату столбцов. Поддерживает fillvalue, для заполнения тех, что не влезли. Невероятно удобно!

Я сделал по образу и подобию как с mkdocs.yml и парсинге/создании новых разделов:

  1. Добавил в свою среду разработки vscode соответствующую задачу

    {
        "label": "Run Autogenerate Todo.md",
        "type": "shell",
        "command": "uv run python -m api.table_generator.service",
        "problemMatcher": [],
        "presentation": {
            "echo": false,
            "reveal": "silent",
            "focus": false,
            "panel": "shared",
            "close": true
        },
    },
    

  2. В settings.json добавил отслеживание сохранения файла

    {
        "event": "onFileChange",
        "match": "TODO\\.md",
        "vscodeTask": ["workbench.action.tasks.runTask", "Run Autogenerate Todo.md"]
    }
    

  3. Сделал эндпоинт на будущее, чтобы например привязать его к синхронизации с TODO.md или основной с GitHub

    @router.patch("/generate_todo")
    def generate_todo() -> None:
        service = TableGeneratorService()
        service.create_mk_checkbox_list()
    

Посмотреть результат можно во вкладке Прогресс добавления функционала

Но функционал преобразования к таблице я не стал вырезать, наверняка с генерацией табличек можно ещё много всего придумать, из идей уже есть:

  • Вкладка со статистикой например по количеству добавленных в каждый раздел записей
  • Удобное оглавление или вроде того

В общем, наверняка пригодится!

А пока что сосредоточусь на создании другого функционала.