Концепция структуры конфигурационных файлов

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