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