Do not modify extensible CI/CD entries by reference

This commit is contained in:
Grzegorz Bizon 2018-08-16 15:01:27 +02:00
parent 58414c143f
commit ef26622d62
2 changed files with 13 additions and 18 deletions

View File

@ -7,16 +7,15 @@ module Gitlab
ExtensionError = Class.new(StandardError)
def initialize(hash, context = hash)
def initialize(hash)
@hash = hash
@context = context
end
def each
@hash.each_pair do |key, value|
next unless value.key?(:extends)
yield Extendable::Entry.new(key, value, @context)
yield Extendable::Entry.new(key, @hash)
end
end
@ -24,7 +23,7 @@ module Gitlab
each do |entry|
raise ExtensionError unless entry.valid?
@hash[entry.key] = entry.extend!
entry.extend!
end
end
end

View File

@ -5,10 +5,9 @@ module Gitlab
class Entry
attr_reader :key
def initialize(key, value, context, parent = nil)
def initialize(key, hash, parent = nil)
@key = key
@value = value
@context = context
@hash = hash
@parent = parent
end
@ -16,32 +15,29 @@ module Gitlab
true
end
# def circular_dependency?
# @extends.to_s == @key.to_s
# end
def value
@value ||= @hash.fetch(@key)
end
def base
Extendable::Entry
.new(extends, @context.fetch(extends), @context, self)
.new(extends, @hash, self)
.extend!
end
def extensible?
@value.key?(:extends)
value.key?(:extends)
end
def extends
@value.fetch(:extends).to_sym
value.fetch(:extends).to_sym
end
def extend!
if extensible?
original = @value.dup
parent = base.dup
@value.clear.deep_merge!(parent).deep_merge!(original)
@hash[key] = base.deep_merge(value)
else
@value.to_h
value
end
end
end