Add basic support for CI/CD config extension

This commit is contained in:
Grzegorz Bizon 2018-08-16 12:25:13 +02:00
parent afb49b044b
commit 5b9a6ca00a
2 changed files with 94 additions and 0 deletions

View file

@ -0,0 +1,31 @@
module Gitlab
module Ci
class Config
class Extendable
include Enumerable
ExtensionError = Class.new(StandardError)
def initialize(hash)
@hash = hash
end
def each
@hash.each_pair do |key, value|
next unless value.key?(:extends)
yield key, value.fetch(:extends).to_sym, value
end
end
def extend!
@hash.tap do
each do |key, extends, value|
@hash[key] = @hash.fetch(extends).deep_merge(value)
end
end
end
end
end
end
end

View file

@ -0,0 +1,63 @@
require 'fast_spec_helper'
describe Gitlab::Ci::Config::Extendable do
subject { described_class.new(hash) }
describe '#each' do
context 'when there is extendable entry in the hash' do
let(:test) do
{ extends: 'something', only: %w[master] }
end
let(:hash) do
{ something: { script: 'ls' }, test: test }
end
it 'yields the test hash' do
expect { |b| subject.each(&b) }
.to yield_with_args(:test, :something, test)
end
end
pending 'when not extending using a hash'
end
describe '#extend!' do
context 'when a hash has a single simple extension' do
let(:hash) do
{
something: {
script: 'deploy',
only: { variables: %w[$SOMETHING] }
},
test: {
extends: 'something',
script: 'ls',
only: { refs: %w[master] }
}
}
end
it 'extends a hash with reverse merge' do
expect(subject.extend!).to eq(
something: {
script: 'deploy',
only: { variables: %w[$SOMETHING] }
},
test: {
extends: 'something',
script: 'ls',
only: {
refs: %w[master],
variables: %w[$SOMETHING]
}
}
)
end
end
pending 'when a hash recursive extensions'
pending 'when invalid `extends` is specified'
end
end