diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index 0767fadcb9ad4f6bb2bb55632975aec23c98cc0e..302cded664f376287ac73798a37597f473b214fc 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -12,22 +12,16 @@ module Gitlab @nodes = {} @errors = [] - unless leaf? || value.is_a?(Hash) + unless leaf? || has_config? @errors << 'should be a configuration entry with hash value' end end def process! - return if leaf? || !valid? + return if leaf? || invalid? keys.each do |key, entry_class| - if @value.has_key?(key) - entry = entry_class.new(@value[key], @root, self) - else - entry = Node::Null.new(nil, @root, self) - end - - @nodes[key] = entry + add_node(key, entry_class) end nodes.each(&:process!) @@ -38,22 +32,30 @@ module Gitlab @nodes.values end - def errors - @errors + nodes.map(&:errors).flatten - end - def valid? errors.none? end + def invalid? + !valid? + end + def leaf? keys.none? end + def has_config? + @value.is_a?(Hash) + end + def keys self.class.nodes || {} end + def errors + @errors + nodes.map(&:errors).flatten + end + def method_missing(name, *args) super unless keys.has_key?(name) raise InvalidError unless valid? @@ -73,6 +75,18 @@ module Gitlab raise NotImplementedError end + private + + def add_node(key, entry_class) + if @value.has_key?(key) + entry = entry_class.new(@value[key], @root, self) + else + entry = Node::Null.new(nil, @root, self) + end + + @nodes[key] = entry + end + class << self attr_reader :nodes diff --git a/lib/gitlab/ci/config/node/null.rb b/lib/gitlab/ci/config/node/null.rb index db3fa05c328ff322804097ce55c4e4415d9bfba3..bf8bc62dc918498bff98735477c46a4c1afdefa3 100644 --- a/lib/gitlab/ci/config/node/null.rb +++ b/lib/gitlab/ci/config/node/null.rb @@ -8,6 +8,7 @@ module Gitlab end def validate! + nil end def method_missing(*) diff --git a/spec/lib/gitlab/ci/config/node/before_script_spec.rb b/spec/lib/gitlab/ci/config/node/before_script_spec.rb index bc34b9c9b562c7b48d9b1ac960003cf5aaa2c8c8..b506b9743c6efb277909a8cf97dfc66021fd448f 100644 --- a/spec/lib/gitlab/ci/config/node/before_script_spec.rb +++ b/spec/lib/gitlab/ci/config/node/before_script_spec.rb @@ -18,6 +18,12 @@ describe Gitlab::Ci::Config::Node::BeforeScript do expect(entry.errors).to be_empty end end + + describe '#has_config?' do + it 'does not have config' do + expect(entry).not_to have_config + end + end end context 'when entry value is not correct' do @@ -29,5 +35,11 @@ describe Gitlab::Ci::Config::Node::BeforeScript do .to include /should be an array of strings/ end end + + describe '#invalid?' do + it 'is not valid' do + expect(entry).to be_invalid + end + end end end diff --git a/spec/lib/gitlab/ci/config/node/global_spec.rb b/spec/lib/gitlab/ci/config/node/global_spec.rb index 66d40be6e6eeb4e55632a8c051b0e5cb73951aed..74a64c6df98438b6e96fe201a26911f1c72a8685 100644 --- a/spec/lib/gitlab/ci/config/node/global_spec.rb +++ b/spec/lib/gitlab/ci/config/node/global_spec.rb @@ -35,6 +35,12 @@ describe Gitlab::Ci::Config::Node::Global do end end + describe '#has_config?' do + it 'has config' do + expect(global).to have_config + end + end + describe '#leaf?' do it 'is not leaf' do expect(global).not_to be_leaf @@ -59,6 +65,12 @@ describe Gitlab::Ci::Config::Node::Global do end end + describe '#invalid?' do + it 'is not valid' do + expect(global).to be_invalid + end + end + describe '#errors' do it 'reports errors from child nodes' do expect(global.errors)