From c2d6d61dac2bf04b649c84ab0f4fe98da906c2c4 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Tue, 7 Jun 2016 13:19:22 +0200
Subject: [PATCH] Add DSL for adding nodes in Ci config interface

---
 lib/gitlab/ci/config/node/before_script.rb    |  4 ----
 lib/gitlab/ci/config/node/entry.rb            | 12 +++++++++++-
 lib/gitlab/ci/config/node/global.rb           |  4 +---
 lib/gitlab/ci/config/node/null.rb             |  4 ----
 spec/lib/gitlab/ci/config/node/global_spec.rb |  4 ++++
 5 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/lib/gitlab/ci/config/node/before_script.rb b/lib/gitlab/ci/config/node/before_script.rb
index 586eab12a08..a8c350f3c7d 100644
--- a/lib/gitlab/ci/config/node/before_script.rb
+++ b/lib/gitlab/ci/config/node/before_script.rb
@@ -5,10 +5,6 @@ module Gitlab
         class BeforeScript < Entry
           include ValidationHelpers
 
-          def keys
-            {}
-          end
-
           def validate!
             unless validate_array_of_strings(@value)
               @errors << 'before_script should be an array of strings'
diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb
index e95bc7bad4b..3043dc4c61f 100644
--- a/lib/gitlab/ci/config/node/entry.rb
+++ b/lib/gitlab/ci/config/node/entry.rb
@@ -48,12 +48,22 @@ module Gitlab
           end
 
           def keys
-            raise NotImplementedError
+            self.class.nodes || {}
           end
 
           def validate!
             raise NotImplementedError
           end
+
+          class << self
+            attr_reader :nodes
+
+            private
+
+            def add_node(symbol, entry_class)
+              (@nodes ||= {}).merge!(symbol.to_sym => entry_class)
+            end
+          end
         end
       end
     end
diff --git a/lib/gitlab/ci/config/node/global.rb b/lib/gitlab/ci/config/node/global.rb
index 81a9d0667be..cfa506c28b7 100644
--- a/lib/gitlab/ci/config/node/global.rb
+++ b/lib/gitlab/ci/config/node/global.rb
@@ -3,9 +3,7 @@ module Gitlab
     class Config
       module Node
         class Global < Entry
-          def keys
-            { before_script: BeforeScript }
-          end
+          add_node :before_script, BeforeScript
         end
       end
     end
diff --git a/lib/gitlab/ci/config/node/null.rb b/lib/gitlab/ci/config/node/null.rb
index 6147b0d882f..fc240e16f55 100644
--- a/lib/gitlab/ci/config/node/null.rb
+++ b/lib/gitlab/ci/config/node/null.rb
@@ -3,10 +3,6 @@ module Gitlab
     class Config
       module Node
         class Null < Entry
-          def keys
-            {}
-          end
-
           def method_missing(*)
             nil
           end
diff --git a/spec/lib/gitlab/ci/config/node/global_spec.rb b/spec/lib/gitlab/ci/config/node/global_spec.rb
index f277c457a3b..05e035ada39 100644
--- a/spec/lib/gitlab/ci/config/node/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/global_spec.rb
@@ -7,6 +7,10 @@ describe Gitlab::Ci::Config::Node::Global do
     it 'can contain global config keys' do
       expect(global.keys).to include :before_script
     end
+
+    it 'returns a hash' do
+      expect(global.keys).to be_a Hash
+    end
   end
 
   context 'when hash is valid' do
-- 
GitLab