Commit a7ac2f74 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Simplify CI config entry node factory, use attribs

parent 9410aecc
......@@ -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,
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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment