Библиотека для кеширования зависящих друг от друга объектов
TODO постановка задачи в процессе формализации
Дано
- Задано некоторое (изначально пустое) пространство объектов разных категорий
Часть категорий — это объекты-исходники
Исходник (возможно, несколько, и возможно — различных категорий) появляется или обновляется (увеличивает версию) в результате запуска некоторой процедуры загрузкии
Оставшиеся категории — это объекты-генераты
Генерат (возможно, несколько, и возможно — различных категорий) конструируется из объектов других категорий (как исходников, так и генератов) с помощью процедуры сборки
У каждого объекта и каждой процедуры есть уникальный идентификатор
У каждого объекта и каждой процедуры есть версия («время создания»). Версия не может уменьшаться.
Появление процедуры или объекта с имеющимся идентификатором, но новой (более поздней) версией называется обновлением
- Решение о присвоении объекту определённой версии принимает процедура
- Если идентификатор и версия совпадают, считается, что объект не изменился.
Известны:
- категории объектов
- спецификация (описание входа и выхода) каждой процедуры загрузки
процедура загрузки допускает спецификацию вида «загрузить все объекты таких-то категорий»
- спецификация (описание входа и выхода) каждой процедуры сборки.
Понятие «актуальности» и «недоступности»
Актуальный объект или процедура всегда имеют наибольшую версию.
Дополнительно:
- Исходник актуален, если он получен с помощью актуальной процедуры загрузки, обновлять его не требуется
Процедуру загрузки можно вызвать явно, даже если все её исходники актуальны, потому что это может привести к обновлению исходников и появлению новых
- Генерат актуален, если он получен последовательностью актуальных сборок из актуальных исходников
Недоступным называется объект, который не может быть получен никакой актуальной процедурой.
Хранение
Хранятся как минимум все версии исходников и все доступные генераты.
Требуется
На основании заданных процедур и хранимого пространства объектов получить цель — заданный набор актуальных исходников и/или генератов.
Если по каким-то причинам объект получить нельзя, возвращается т. н. пустой объект, при этом доступен вердикт — обоснование, отчего объект не получен.
Условия
- Если хранимый объект актуален, процедуры не выполняются — выдаётся хранимый объект
- Сборка и загрузка объекта могут окончиться неуспехом — возвращается пустой объект + вердикт
Цель может быть задана неявно: например, «загрузить все возможные исходники, а затем все генераты данной категории, которые можно собрать из имеющихся исходников»
- Должна быть возможность удаления недоступных объектов
- Должна быть возможность удаления всех генератов
- Сборка должна иметь два режима работы с исходниками
- Используются только актуальные исходники
- Используются все версии актуальных исходников
Реализация
TODO Пока только идеи
- Построение графа зависимостей на основании спецификации процедур
- Запихивание под капот всего, что только можно, вплоть до того, что достаточно будет написать
- … и система запомнит, что:
bin_file — это категория генерата
bin_file изготавливается из c_file
c_file берётся последней версии (для работы со всеми версиями будет другой декоратор, например @versioned_build)
Генерат ли c_file или исходник — определится по какому-нибудь
c_compile — это процедура сборки (@build)
- …