Simplify CI config entry node factory, use attribs
This commit is contained in:
parent
9410aecca8
commit
a7ac2f7494
|
|
@ -26,7 +26,9 @@ module Gitlab
|
|||
private
|
||||
|
||||
def create_node(key, factory)
|
||||
factory.with(value: @config[key], key: key, parent: self)
|
||||
factory
|
||||
.value(config[key])
|
||||
.with(key: key, parent: self, global: global)
|
||||
|
||||
factory.create!
|
||||
end
|
||||
|
|
|
|||
|
|
@ -8,13 +8,17 @@ module Gitlab
|
|||
class Entry
|
||||
class InvalidError < StandardError; end
|
||||
|
||||
attr_reader :config
|
||||
attr_accessor :key, :parent, :description
|
||||
attr_reader :config, :attributes
|
||||
attr_accessor :key, :parent, :global, :description
|
||||
|
||||
def initialize(config)
|
||||
def initialize(config, **attributes)
|
||||
@config = config
|
||||
@nodes = {}
|
||||
|
||||
(@attributes = attributes).each do |attribute, value|
|
||||
public_send("#{attribute}=", value)
|
||||
end
|
||||
|
||||
@validator = self.class.validator.new(self)
|
||||
@validator.validate
|
||||
end
|
||||
|
|
@ -68,10 +72,6 @@ module Gitlab
|
|||
true
|
||||
end
|
||||
|
||||
def attributes
|
||||
{ key: @key, parent: @parent, description: @description }
|
||||
end
|
||||
|
||||
def self.default
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -13,38 +13,29 @@ module Gitlab
|
|||
@attributes = {}
|
||||
end
|
||||
|
||||
def value(value)
|
||||
@value = value
|
||||
self
|
||||
end
|
||||
|
||||
def with(attributes)
|
||||
@attributes.merge!(attributes)
|
||||
self
|
||||
end
|
||||
|
||||
def create!
|
||||
raise InvalidFactory unless @attributes.has_key?(:value)
|
||||
raise InvalidFactory unless defined?(@value)
|
||||
|
||||
##
|
||||
# We assume that unspecified entry is undefined.
|
||||
# See issue #18775.
|
||||
#
|
||||
if @attributes[:value].nil?
|
||||
fabricate(Node::Undefined, @node)
|
||||
if @value.nil?
|
||||
Node::Undefined.new(@node, @attributes)
|
||||
else
|
||||
fabricate(@node, @attributes[:value])
|
||||
@node.new(@value, @attributes)
|
||||
end
|
||||
end
|
||||
|
||||
def self.fabricate(node, value, **attributes)
|
||||
node.new(value).tap do |entry|
|
||||
entry.key = attributes[:key]
|
||||
entry.parent = attributes[:parent]
|
||||
entry.description = attributes[:description]
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def fabricate(node, value)
|
||||
self.class.fabricate(node, value, @attributes)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -51,6 +51,10 @@ module Gitlab
|
|||
def stages
|
||||
stages_defined? ? stages_value : types_value
|
||||
end
|
||||
|
||||
def global
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@ module Gitlab
|
|||
private
|
||||
|
||||
def create_node(key, value)
|
||||
node = key.to_s.start_with?('.') ? Node::HiddenJob : Node::Job
|
||||
job_node = key.to_s.start_with?('.') ? Node::HiddenJob : Node::Job
|
||||
|
||||
attributes = { key: key,
|
||||
parent: self,
|
||||
description: "#{key} job definition." }
|
||||
job_attributes = { key: key,
|
||||
parent: self,
|
||||
description: "#{key} job definition." }
|
||||
|
||||
Node::Factory.fabricate(node, value, attributes)
|
||||
job_node.new(value, attributes.merge(job_attributes))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ module Gitlab
|
|||
validates :config, type: Class
|
||||
end
|
||||
|
||||
def initialize(node)
|
||||
def initialize(node, **attributes)
|
||||
super
|
||||
@strategy = create_strategy(node, node.default)
|
||||
end
|
||||
|
|
@ -34,9 +34,7 @@ module Gitlab
|
|||
if default.nil?
|
||||
Undefined::NullStrategy.new
|
||||
else
|
||||
entry = Node::Factory
|
||||
.fabricate(node, default, attributes)
|
||||
|
||||
entry = node.new(default, attributes)
|
||||
Undefined::DefaultStrategy.new(entry)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,24 +5,10 @@ describe Gitlab::Ci::Config::Node::Factory do
|
|||
let(:factory) { described_class.new(entry_class) }
|
||||
let(:entry_class) { Gitlab::Ci::Config::Node::Script }
|
||||
|
||||
describe '.fabricate' do
|
||||
it 'fabricates entry with attributes set' do
|
||||
fabricated = described_class
|
||||
.fabricate(entry_class, ['ls'],
|
||||
parent: true, key: :test)
|
||||
|
||||
expect(fabricated.parent).to be true
|
||||
expect(fabricated.key).to eq :test
|
||||
expect(fabricated.value).to eq ['ls']
|
||||
expect(fabricated.attributes)
|
||||
.to eq(parent: true, key: :test, description: nil)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when setting up a value' do
|
||||
it 'creates entry with valid value' do
|
||||
entry = factory
|
||||
.with(value: ['ls', 'pwd'])
|
||||
.value(['ls', 'pwd'])
|
||||
.create!
|
||||
|
||||
expect(entry.value).to eq ['ls', 'pwd']
|
||||
|
|
@ -31,7 +17,7 @@ describe Gitlab::Ci::Config::Node::Factory do
|
|||
context 'when setting description' do
|
||||
it 'creates entry with description' do
|
||||
entry = factory
|
||||
.with(value: ['ls', 'pwd'])
|
||||
.value(['ls', 'pwd'])
|
||||
.with(description: 'test description')
|
||||
.create!
|
||||
|
||||
|
|
@ -43,7 +29,8 @@ describe Gitlab::Ci::Config::Node::Factory do
|
|||
context 'when setting key' do
|
||||
it 'creates entry with custom key' do
|
||||
entry = factory
|
||||
.with(value: ['ls', 'pwd'], key: 'test key')
|
||||
.value(['ls', 'pwd'])
|
||||
.with(key: 'test key')
|
||||
.create!
|
||||
|
||||
expect(entry.key).to eq 'test key'
|
||||
|
|
@ -55,7 +42,8 @@ describe Gitlab::Ci::Config::Node::Factory do
|
|||
|
||||
it 'creates entry with valid parent' do
|
||||
entry = factory
|
||||
.with(value: 'ls', parent: parent)
|
||||
.value('ls')
|
||||
.with(parent: parent)
|
||||
.create!
|
||||
|
||||
expect(entry.parent).to eq parent
|
||||
|
|
@ -74,7 +62,7 @@ describe Gitlab::Ci::Config::Node::Factory do
|
|||
context 'when creating entry with nil value' do
|
||||
it 'creates an undefined entry' do
|
||||
entry = factory
|
||||
.with(value: nil)
|
||||
.value(nil)
|
||||
.create!
|
||||
|
||||
expect(entry).to be_an_instance_of Gitlab::Ci::Config::Node::Undefined
|
||||
|
|
|
|||
Loading…
Reference in New Issue