Два различных файлов в нашем хранилище содержит следующие строки:Объединение два повара атрибуты
# library_cookbook_1/attributes/default.rb
default[:library_cookbook_1][:foo] = true
# library_cookbook_2/attributes/default.rb
default[:library_cookbook_2][:foo] = true
Я хотел бы объединить оба этих атрибутов. Недостаточно просто установить одно равное другому, потому что они оба используются взаимозаменяемо. Наибольшее беспокойство вызывает то, что кто-то делает эту ошибку:
"environment_json_attributes": {
"library_cookbook_1": {
"foo": false //Now it's false half of the time...
}
}
Забыв установить значение обеих переменных в коде является фатальной ошибкой при нашей нынешней структуре. Я хочу объединить атрибуты таким образом, чтобы поддерживать иерархию переопределения, так что если в библиотеке_cookbook_1 есть переопределение уровня роли, но у библиотеки_cookbook_2 есть переопределение уровня среды, шеф-повар будет обрабатывать переопределения, как если бы атрибуты были всего лишь одним атрибутом.
Идеальный код слияния будет выглядеть примерно так:
> node.attributes.debug_value('library_cookbook_1', 'foo')
{'precedence1' => true, 'precendence3' => false}
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => false, 'precendence2' => true}
> attr_merge(['library_cookbook_1', 'foo'], ['library_cookbook_2', 'foo'])
> node.attributes.debug_value('library_cookbook_1', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false}
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false}
> node[:library_cookbook_1][:foo].precedence4 = true
> node.attributes.debug_value('library_cookbook_2', 'foo')
{'precedence1' => true, 'precendence2' => true, 'precendence3' => false, 'precedence4' => true}
В идеале, я хочу, чтобы каждый атрибут будет указателем на то же самое, так что путь, будущие вызовы и задания применяются к обоим.
Теперь очевидным ответом является просто рефакторинг одного из атрибутов. К сожалению, шеф-повар затрудняет реорганизацию атрибутов - у нас есть 10 различных сред, 7 разных ролей, 20 узлов на среду и т. Д. Мы обязательно сделаем ошибку, которая будет проявляться тонко, если мы попытаемся реорганизовать все это.
У вас гораздо больше проблем с тонкостью, если вы попытаетесь сохранить два разных атрибута. Сделайте это правильно, или вы заплатите цену в течение длительного времени. –