Commit 80587064 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Require parent when using node factory in CI config

parent 8f7c98ee
...@@ -28,7 +28,8 @@ module Gitlab ...@@ -28,7 +28,8 @@ module Gitlab
def create(key, factory) def create(key, factory)
factory factory
.value(@config[key]) .value(@config[key])
.with(key: key, parent: self, global: @global) .parent(self)
.with(key: key)
factory.create! factory.create!
end end
...@@ -40,11 +41,11 @@ module Gitlab ...@@ -40,11 +41,11 @@ module Gitlab
private private
def node(symbol, entry_class, metadata) def node(key, node, metadata)
factory = Node::Factory.new(entry_class) factory = Node::Factory.new(node)
.with(description: metadata[:description]) .with(description: metadata[:description])
(@nodes ||= {}).merge!(symbol.to_sym => factory) (@nodes ||= {}).merge!(key.to_sym => factory)
end end
def helpers(*nodes) def helpers(*nodes)
......
...@@ -18,6 +18,11 @@ module Gitlab ...@@ -18,6 +18,11 @@ module Gitlab
self self
end end
def parent(parent)
@parent = parent
self
end
def with(attributes) def with(attributes)
@attributes.merge!(attributes) @attributes.merge!(attributes)
self self
...@@ -25,15 +30,19 @@ module Gitlab ...@@ -25,15 +30,19 @@ module Gitlab
def create! def create!
raise InvalidFactory unless defined?(@value) raise InvalidFactory unless defined?(@value)
raise InvalidFactory unless defined?(@parent)
attributes = { parent: @parent, global: @parent.global }
attributes.merge!(@attributes)
## ##
# We assume that unspecified entry is undefined. # We assume that unspecified entry is undefined.
# See issue #18775. # See issue #18775.
# #
if @value.nil? if @value.nil?
Node::Undefined.new(@node, @attributes) Node::Undefined.new(@node, attributes)
else else
@node.new(@value, @attributes) @node.new(@value, attributes)
end end
end end
end end
......
...@@ -53,9 +53,10 @@ module Gitlab ...@@ -53,9 +53,10 @@ module Gitlab
def compose_jobs! def compose_jobs!
factory = Node::Factory.new(Node::Jobs) factory = Node::Factory.new(Node::Jobs)
factory.value(@config.except(*nodes.keys)) .value(@config.except(*nodes.keys))
factory.with(key: :jobs, parent: self, global: self) .parent(self)
factory.with(description: 'Jobs definition for this pipeline') .with(key: :jobs, global: self)
.with(description: 'Jobs definition for this pipeline')
@entries[:jobs] = factory.create! @entries[:jobs] = factory.create!
end end
......
...@@ -30,14 +30,14 @@ module Gitlab ...@@ -30,14 +30,14 @@ module Gitlab
private private
def create(name, config) def create(name, config)
Node::Factory.new(job_node(name)) Node::Factory.new(node(name))
.value(config || {}) .value(config || {})
.with(key: name, parent: self, global: @global) .parent(self)
.with(description: "#{name} job definition.") .with(key: name, description: "#{name} job definition.")
.create! .create!
end end
def job_node(name) def node(name)
if name.to_s.start_with?('.') if name.to_s.start_with?('.')
Node::HiddenJob Node::HiddenJob
else else
......
...@@ -2,22 +2,40 @@ require 'spec_helper' ...@@ -2,22 +2,40 @@ require 'spec_helper'
describe Gitlab::Ci::Config::Node::Factory do describe Gitlab::Ci::Config::Node::Factory do
describe '#create!' do describe '#create!' do
let(:factory) { described_class.new(entry_class) } let(:factory) { described_class.new(node) }
let(:entry_class) { Gitlab::Ci::Config::Node::Script } let(:node) { Gitlab::Ci::Config::Node::Script }
let(:parent) { double('parent') }
let(:global) { double('global') }
context 'when setting up a value' do before do
allow(parent).to receive(:global).and_return(global)
end
context 'when setting a concrete value' do
it 'creates entry with valid value' do it 'creates entry with valid value' do
entry = factory entry = factory
.value(['ls', 'pwd']) .value(['ls', 'pwd'])
.parent(parent)
.create! .create!
expect(entry.value).to eq ['ls', 'pwd'] expect(entry.value).to eq ['ls', 'pwd']
end end
it 'sets parent and global attributes' do
entry = factory
.value('ls')
.parent(parent)
.create!
expect(entry.global).to eq global
expect(entry.parent).to eq parent
end
context 'when setting description' do context 'when setting description' do
it 'creates entry with description' do it 'creates entry with description' do
entry = factory entry = factory
.value(['ls', 'pwd']) .value(['ls', 'pwd'])
.parent(parent)
.with(description: 'test description') .with(description: 'test description')
.create! .create!
...@@ -30,6 +48,7 @@ describe Gitlab::Ci::Config::Node::Factory do ...@@ -30,6 +48,7 @@ describe Gitlab::Ci::Config::Node::Factory do
it 'creates entry with custom key' do it 'creates entry with custom key' do
entry = factory entry = factory
.value(['ls', 'pwd']) .value(['ls', 'pwd'])
.parent(parent)
.with(key: 'test key') .with(key: 'test key')
.create! .create!
...@@ -38,20 +57,21 @@ describe Gitlab::Ci::Config::Node::Factory do ...@@ -38,20 +57,21 @@ describe Gitlab::Ci::Config::Node::Factory do
end end
context 'when setting a parent' do context 'when setting a parent' do
let(:parent) { Object.new } let(:object) { Object.new }
it 'creates entry with valid parent' do it 'creates entry with valid parent' do
entry = factory entry = factory
.value('ls') .value('ls')
.with(parent: parent) .parent(parent)
.with(parent: object)
.create! .create!
expect(entry.parent).to eq parent expect(entry.parent).to eq object
end end
end end
end end
context 'when not setting up a value' do context 'when not setting a value' do
it 'raises error' do it 'raises error' do
expect { factory.create! }.to raise_error( expect { factory.create! }.to raise_error(
Gitlab::Ci::Config::Node::Factory::InvalidFactory Gitlab::Ci::Config::Node::Factory::InvalidFactory
...@@ -59,10 +79,19 @@ describe Gitlab::Ci::Config::Node::Factory do ...@@ -59,10 +79,19 @@ describe Gitlab::Ci::Config::Node::Factory do
end end
end end
context 'when not setting parent object' do
it 'raises error' do
expect { factory.value('ls').create! }.to raise_error(
Gitlab::Ci::Config::Node::Factory::InvalidFactory
)
end
end
context 'when creating entry with nil value' do context 'when creating entry with nil value' do
it 'creates an undefined entry' do it 'creates an undefined entry' do
entry = factory entry = factory
.value(nil) .value(nil)
.parent(parent)
.create! .create!
expect(entry).to be_an_instance_of Gitlab::Ci::Config::Node::Undefined 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