62 lines
1.6 KiB
Ruby
62 lines
1.6 KiB
Ruby
|
module Gitlab
|
||
|
module Ci
|
||
|
class Config
|
||
|
module Node
|
||
|
##
|
||
|
# This mixin is responsible for adding DSL, which purpose is to
|
||
|
# simplifly process of adding child nodes.
|
||
|
#
|
||
|
# This can be used only if parent node is a configuration entry that
|
||
|
# holds a hash as a configuration value, for example:
|
||
|
#
|
||
|
# job:
|
||
|
# script: ...
|
||
|
# artifacts: ...
|
||
|
#
|
||
|
module Configurable
|
||
|
extend ActiveSupport::Concern
|
||
|
|
||
|
def allowed_nodes
|
||
|
self.class.allowed_nodes || {}
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def prevalidate!
|
||
|
unless @value.is_a?(Hash)
|
||
|
@errors << 'should be a configuration entry with hash value'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def create_node(key, factory)
|
||
|
factory.with(value: @value[key])
|
||
|
factory.nullify! unless @value.has_key?(key)
|
||
|
factory.create!
|
||
|
end
|
||
|
|
||
|
class_methods do
|
||
|
def allowed_nodes
|
||
|
Hash[@allowed_nodes.map { |key, factory| [key, factory.dup] }]
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def allow_node(symbol, entry_class, metadata)
|
||
|
factory = Node::Factory.new(entry_class)
|
||
|
.with(description: metadata[:description])
|
||
|
|
||
|
define_method(symbol) do
|
||
|
raise Entry::InvalidError unless valid?
|
||
|
|
||
|
@nodes[symbol].try(:value)
|
||
|
end
|
||
|
|
||
|
(@allowed_nodes ||= {}).merge!(symbol => factory)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|