Концепция структуры конфигурационных файлов¶ ↑
Есть 2 папки - SRC и BIN. В SRC находятся YAML-файлы конфигурации в структуре вложенных папок отражающей наследование. В BIN помещаются сгруппированные файлы конфигурации в заданном формате (после компиляции).
Прототип - объект конфигурации (список ключ-значение и имя)
Пример:
item_name_123: id: 100500 name: Item Name field: "Field value"
Метапрототип - объект на который накладываются данные из прототипа, с целью получения результирующего прототипа.
Пример:
bot: true shopable: true states: - { name: "State 1", period: 1s } - { name: "State 2", period: 1s }
Результирующий прототип - прототип получающийся в результате объединения нескольких метапрототипов (по иерархии) и исходного прототипа.
Пример
item_name_123: id: 100500 name: Item Name field: "Field value" bot: true shopable: true states: - name: "State 1" period: 1s - name: "State 2" period: 1s
SRC представляет собой следующую структуру
src_path/common.yml - базовая конфигурация src_path/item.yml - конфигурация для базового метапрототипа Item src_path/quest.yml - для Quest src_path/env1/ - Конфигурация для окружения env1 src_path/env1/item.yml - Базовая конфигурация метапрототипа Item в окружении env1 src_path/env1/quest.yml - Quest в env2 src_path/env1/item/items.yml - Конфигурация прототипов Item src_path/env1/item/quest_items.yml - прототипы Quest src_path/env2/ - Конфигурация для окружения env2 src_path/env2/...
Каждый прототип из src_path/env1/item/items.yml или src_path/env1/item/quest_items.yml накладывается последовательно на своих родителей. То есть каждый прототип из src_path/env1/item/items.yml накладывается сначала на src_path/env1/item.yml, потом на src_path/item.yml и в конце на src_path/common.yml. Результирующий список прототипов (снимок) имеет те же имена объектов, что были перечислены первоначально в src_path/env1/item/items.yml.
Компиляция¶ ↑
Получившийся снимок может быть скомпилирован и помещен в BIN в соответствии с именем своего базового метапрототипа. То есть для всех объектов из src_path/env1/item.yml с генерируется файл bin_src/env_1_item.<расширение формата> в соответствии с форматом компиляции.
Наследование метапрототипов¶ ↑
Метапрототипы могут представлять иерархическую структуру наследования. Например в приведенном примере представлена двухуровневая структура наследования для базовых метапрототипов Item и Quest.
Item |-----> Build |-----> Unit Quest |-----> History (Story) |-----> Battle
При этом предполагается, что на основе иерархии наследования можно вводить любое число метапототипов (увеличивая уровень наследования), получая необходимые сущности для приложения.
Данная структура исключает множественное наследование, в пользу простого наследования.
Фичарсы¶ ↑
-
Возможность автоматической сборки прототипов на любом уровне иерархии (например YAML, Syck, Psych)
-
Возможность изменять объект любого уровня в иерархии метапрототипов готовыми библиотеками (например Psych, Syck, Psych) не опасаясь нарушить структуру данных (развернутый merge, битые alias)
-
Интуитивно понятное расположение файлов по аналогии с иерархией классов
-
Возможность распределение прав доступа на редактирование отдельных метапрототипов или переопределяемых полей в результирующем прототипе
-
Расширяемость. Возможность изменения механизма сбора данных (из SRC) и расширения форматов компиляции
Текущее состояние реализации¶ ↑
-
Имеется общий конфигурационный файл позволяющий задавать произвольные пути для BIN и SRC. Этот файл также может быть помещен в произвольные места текущего проекта.
-
Поддержка сборки данных (создания снимка) в описанном формате
-
Есть поддержка компиляции в формат JSON (JavaScript) и YAML
Запуск¶ ↑
Для запуска нужно открыть irb в корне репозитория и выполнить
require './mech' puts Mech.compile
TODO¶ ↑
-
Реализовать произвольную глубину вложенности для базовый метапрототипов. Сейчас структура у Quest должна быть равна по глубине структуре Item, в противном случае в общий снимок попадут данные только для самой глубокой иерархии метапрототипа.
-
Написать тесты для различных вариантов конфигурации
-
Сделать интерфейс для редактирования прототипов и метапрототипов