Project

mech

0.0
No commit activity in last 3 years
No release in over 3 years
Build config formats from nested yaml
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 1.0.0
~> 1.6.4
>= 0
 Project Readme

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

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