diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/ci/config/extendable/entry.rb | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/gitlab/ci/config/extendable/entry.rb b/lib/gitlab/ci/config/extendable/entry.rb index d5eef647b3e..5b26faaa806 100644 --- a/lib/gitlab/ci/config/extendable/entry.rb +++ b/lib/gitlab/ci/config/extendable/entry.rb @@ -9,28 +9,26 @@ module Gitlab @key = key @context = context @parent = parent + + raise StandardError, 'Invalid entry key!' unless @context.key?(@key) end - def valid? - true + def extensible? + value.is_a?(Hash) && value.key?(:extends) end def value @value ||= @context.fetch(@key) end - def base_hash - Extendable::Entry + def base_hash! + @base ||= Extendable::Entry .new(extends_key, @context, self) .extend! end - def extensible? - value.key?(:extends) - end - def extends_key - value.fetch(:extends).to_s.to_sym + value.fetch(:extends).to_s.to_sym if extensible? end def path @@ -38,19 +36,23 @@ module Gitlab end def extend! - if circular_dependency? - raise Extendable::Collection::CircularDependencyError + return value unless extensible? + + if unknown_extension? + raise Extendable::Collection::InvalidExtensionError, + 'Unknown extension!' end - if invalid_extends_key? - raise Extendable::Collection::InvalidExtensionError + if invalid_base? + raise Extendable::Collection::InvalidExtensionError, + 'Invalid base hash!' end - if extensible? - @context[key] = base_hash.deep_merge(value) - else - value + if circular_dependency? + raise Extendable::Collection::CircularDependencyError end + + @context[key] = base_hash!.deep_merge(value) end private @@ -59,9 +61,13 @@ module Gitlab path.count(key) > 1 end - def invalid_extends_key? + def unknown_extension? !@context.key?(key) end + + def invalid_base? + !@context[extends_key].is_a?(Hash) + end end end end |