Концепция структуры конфигурационных файлов
Есть 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, в противном случае в общий снимок попадут данные только для самой глубокой иерархии метапрототипа.
- Написать тесты для различных вариантов конфигурации
- Сделать интерфейс для редактирования прототипов и метапрототипов