Return default config value when entry is undefined
This commit is contained in:
parent
05ce8a1187
commit
bc2348f2e4
9 changed files with 78 additions and 55 deletions
|
@ -33,12 +33,12 @@ module Gitlab
|
|||
|
||||
class_methods do
|
||||
def nodes
|
||||
Hash[@allowed_nodes.map { |key, factory| [key, factory.dup] }]
|
||||
Hash[@nodes.map { |key, factory| [key, factory.dup] }]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def allow_node(symbol, entry_class, metadata)
|
||||
def node(symbol, entry_class, metadata)
|
||||
factory = Node::Factory.new(entry_class)
|
||||
.with(description: metadata[:description])
|
||||
|
||||
|
@ -47,7 +47,7 @@ module Gitlab
|
|||
@nodes[symbol].try(:value)
|
||||
end
|
||||
|
||||
(@allowed_nodes ||= {}).merge!(symbol => factory)
|
||||
(@nodes ||= {}).merge!(symbol => factory)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -52,6 +52,9 @@ module Gitlab
|
|||
@config
|
||||
end
|
||||
|
||||
def self.default
|
||||
end
|
||||
|
||||
def self.nodes
|
||||
{}
|
||||
end
|
||||
|
|
|
@ -8,8 +8,8 @@ module Gitlab
|
|||
class Factory
|
||||
class InvalidFactory < StandardError; end
|
||||
|
||||
def initialize(entry_class)
|
||||
@entry_class = entry_class
|
||||
def initialize(node)
|
||||
@node = node
|
||||
@attributes = {}
|
||||
end
|
||||
|
||||
|
@ -19,14 +19,15 @@ module Gitlab
|
|||
end
|
||||
|
||||
def undefine!
|
||||
@entry_class = Node::Undefined
|
||||
@attributes[:value] = @node.dup
|
||||
@node = Node::Undefined
|
||||
self
|
||||
end
|
||||
|
||||
def create!
|
||||
raise InvalidFactory unless @attributes.has_key?(:value)
|
||||
|
||||
@entry_class.new(@attributes[:value]).tap do |entry|
|
||||
@node.new(@attributes[:value]).tap do |entry|
|
||||
entry.description = @attributes[:description]
|
||||
entry.key = @attributes[:key]
|
||||
end
|
||||
|
|
|
@ -9,19 +9,19 @@ module Gitlab
|
|||
class Global < Entry
|
||||
include Configurable
|
||||
|
||||
allow_node :before_script, Script,
|
||||
node :before_script, Script,
|
||||
description: 'Script that will be executed before each job.'
|
||||
|
||||
allow_node :image, Image,
|
||||
node :image, Image,
|
||||
description: 'Docker image that will be used to execute jobs.'
|
||||
|
||||
allow_node :services, Services,
|
||||
node :services, Services,
|
||||
description: 'Docker images that will be linked to the container.'
|
||||
|
||||
allow_node :after_script, Script,
|
||||
node :after_script, Script,
|
||||
description: 'Script that will be executed after each job.'
|
||||
|
||||
allow_node :variables, Variables,
|
||||
node :variables, Variables,
|
||||
description: 'Environment variables that will be used.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,17 +3,21 @@ module Gitlab
|
|||
class Config
|
||||
module Node
|
||||
##
|
||||
# This class represents a configuration entry that is not defined
|
||||
# in configuration file.
|
||||
# This class represents an undefined entry node.
|
||||
#
|
||||
# This implements a Null Object pattern.
|
||||
# It takes original entry class as configuration and returns default
|
||||
# value of original entry as self value.
|
||||
#
|
||||
# It can be initialized using a default value of entry that is not
|
||||
# present in configuration.
|
||||
#
|
||||
class Undefined < Entry
|
||||
def method_missing(*)
|
||||
nil
|
||||
include Validatable
|
||||
|
||||
validations do
|
||||
validates :config, type: Class
|
||||
end
|
||||
|
||||
def value
|
||||
@config.default
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -13,7 +13,11 @@ module Gitlab
|
|||
end
|
||||
|
||||
def value
|
||||
@config || {}
|
||||
@config || self.class.default
|
||||
end
|
||||
|
||||
def self.default
|
||||
{}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,7 +10,7 @@ describe Gitlab::Ci::Config::Node::Configurable do
|
|||
describe 'configured nodes' do
|
||||
before do
|
||||
node.class_eval do
|
||||
allow_node :object, Object, description: 'test object'
|
||||
node :object, Object, description: 'test object'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,23 +1,34 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::Ci::Config::Node::Undefined do
|
||||
let(:entry) { described_class.new('some value') }
|
||||
let(:undefined) { described_class.new(entry) }
|
||||
let(:entry) { Class.new }
|
||||
|
||||
describe '#leaf?' do
|
||||
it 'is leaf node' do
|
||||
expect(entry).to be_leaf
|
||||
expect(undefined).to be_leaf
|
||||
end
|
||||
end
|
||||
|
||||
describe '#any_method' do
|
||||
it 'responds with nil' do
|
||||
expect(entry.any_method).to be nil
|
||||
describe '#valid?' do
|
||||
it 'is always valid' do
|
||||
expect(undefined).to be_valid
|
||||
end
|
||||
end
|
||||
|
||||
describe '#errors' do
|
||||
it 'is does not contain errors' do
|
||||
expect(undefined.errors).to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
describe '#value' do
|
||||
it 'returns configured value' do
|
||||
expect(entry.value).to eq 'some value'
|
||||
before do
|
||||
allow(entry).to receive(:default).and_return('some value')
|
||||
end
|
||||
|
||||
it 'returns default value for entry that is undefined' do
|
||||
expect(undefined.value).to eq 'some value'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -40,38 +40,38 @@ describe Gitlab::Ci::Config do
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when config is invalid' do
|
||||
context 'when yml is incorrect' do
|
||||
let(:yml) { '// invalid' }
|
||||
context 'when config is invalid' do
|
||||
context 'when yml is incorrect' do
|
||||
let(:yml) { '// invalid' }
|
||||
|
||||
describe '.new' do
|
||||
it 'raises error' do
|
||||
expect { config }.to raise_error(
|
||||
Gitlab::Ci::Config::Loader::FormatError,
|
||||
/Invalid configuration format/
|
||||
)
|
||||
end
|
||||
describe '.new' do
|
||||
it 'raises error' do
|
||||
expect { config }.to raise_error(
|
||||
Gitlab::Ci::Config::Loader::FormatError,
|
||||
/Invalid configuration format/
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when config logic is incorrect' do
|
||||
let(:yml) { 'before_script: "ls"' }
|
||||
|
||||
describe '#valid?' do
|
||||
it 'is not valid' do
|
||||
expect(config).not_to be_valid
|
||||
end
|
||||
|
||||
it 'has errors' do
|
||||
expect(config.errors).not_to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
context 'when config logic is incorrect' do
|
||||
let(:yml) { 'before_script: "ls"' }
|
||||
|
||||
describe '#valid?' do
|
||||
it 'is not valid' do
|
||||
expect(config).not_to be_valid
|
||||
end
|
||||
|
||||
it 'has errors' do
|
||||
expect(config.errors).not_to be_empty
|
||||
end
|
||||
end
|
||||
|
||||
describe '#errors' do
|
||||
it 'returns an array of strings' do
|
||||
expect(config.errors).to all(be_an_instance_of(String))
|
||||
end
|
||||
describe '#errors' do
|
||||
it 'returns an array of strings' do
|
||||
expect(config.errors).to all(be_an_instance_of(String))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue