diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-06-24 10:13:55 +0200 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2016-06-27 14:01:12 +0200 |
commit | 56e88b8c28282976be258ba53a9f82662cc74703 (patch) | |
tree | 096b40a4537c3b0ec7048aaea42e83b2a5137fee | |
parent | ce4478ed86e7487ea6bb45703561d1d5539ef5b4 (diff) | |
download | gitlab-ce-56e88b8c28282976be258ba53a9f82662cc74703.tar.gz |
Add new ci config entry that handles cache config
-rw-r--r-- | lib/gitlab/ci/config/node/cache.rb | 39 | ||||
-rw-r--r-- | lib/gitlab/ci/config/node/configurable.rb | 28 | ||||
-rw-r--r-- | lib/gitlab/ci/config/node/global.rb | 3 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/config/node/cache_spec.rb | 60 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/config/node/configurable_spec.rb | 33 |
5 files changed, 151 insertions, 12 deletions
diff --git a/lib/gitlab/ci/config/node/cache.rb b/lib/gitlab/ci/config/node/cache.rb new file mode 100644 index 00000000000..c6508e59c4b --- /dev/null +++ b/lib/gitlab/ci/config/node/cache.rb @@ -0,0 +1,39 @@ +module Gitlab + module Ci + class Config + module Node + ## + # Entry that represents a cache configuration + # + class Cache < Entry + include Configurable + + validations do + validate :allowed_keys + + def unknown_keys + return [] unless @node.config.is_a?(Hash) + + @node.config.keys - @node.class.nodes.keys + end + + def allowed_keys + if unknown_keys.any? + errors.add(:config, "contains unknown keys #{unknown_keys}") + end + end + end + + node :key, Node::Key, + description: 'Cache key used to define a cache affinity.' + + node :untracked, Boolean, + description: 'Cache all untracked files.' + + node :paths, Paths, + description: 'Specify which paths should be cached across builds.' + end + end + end + end +end diff --git a/lib/gitlab/ci/config/node/configurable.rb b/lib/gitlab/ci/config/node/configurable.rb index 590cf3d7b70..46a473ad092 100644 --- a/lib/gitlab/ci/config/node/configurable.rb +++ b/lib/gitlab/ci/config/node/configurable.rb @@ -32,28 +32,32 @@ module Gitlab class_methods do def nodes - Hash[@nodes.map { |key, factory| [key, factory.dup] }] + Hash[(@nodes || {}).map { |key, factory| [key, factory.dup] }] end private def node(symbol, entry_class, metadata) - define_method("#{symbol}_defined?") do - @nodes[symbol].try(:defined?) - end - - define_method("#{symbol}_value") do - raise Entry::InvalidError unless valid? - @nodes[symbol].try(:value) - end - - alias_method symbol.to_sym, "#{symbol}_value".to_sym - factory = Node::Factory.new(entry_class) .with(description: metadata[:description]) (@nodes ||= {}).merge!(symbol.to_sym => factory) end + + def helpers(*nodes) + nodes.each do |symbol| + define_method("#{symbol}_defined?") do + @nodes[symbol].try(:defined?) + end + + define_method("#{symbol}_value") do + raise Entry::InvalidError unless valid? + @nodes[symbol].try(:value) + end + + alias_method symbol.to_sym, "#{symbol}_value".to_sym + end + end end end end diff --git a/lib/gitlab/ci/config/node/global.rb b/lib/gitlab/ci/config/node/global.rb index 88f9bb3f43e..4ca379712c6 100644 --- a/lib/gitlab/ci/config/node/global.rb +++ b/lib/gitlab/ci/config/node/global.rb @@ -30,6 +30,9 @@ module Gitlab node :types, Stages, description: 'Stages for this pipeline (deprecated key).' + helpers :before_script, :image, :services, :after_script, :variables, + :stages, :types + def stages stages_defined? ? stages_value : types_value end diff --git a/spec/lib/gitlab/ci/config/node/cache_spec.rb b/spec/lib/gitlab/ci/config/node/cache_spec.rb new file mode 100644 index 00000000000..d6428f6b996 --- /dev/null +++ b/spec/lib/gitlab/ci/config/node/cache_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe Gitlab::Ci::Config::Node::Cache do + let(:entry) { described_class.new(config) } + + describe 'validations' do + before { entry.process! } + + context 'when entry config value is correct' do + let(:config) do + { key: 'some key', + untracked: true, + paths: ['some/path/'] } + end + + describe '#value' do + it 'returns hash value' do + expect(entry.value).to eq config + end + end + + describe '#valid?' do + it 'is valid' do + expect(entry).to be_valid + end + end + end + + context 'when entry value is not correct' do + describe '#errors' do + context 'when is not a hash' do + let(:config) { 'ls' } + + it 'reports errors with config value' do + expect(entry.errors) + .to include 'Cache config should be a hash' + end + end + + context 'when descendants are invalid' do + let(:config) { { key: 1 } } + + it 'reports error with descendants' do + expect(entry.errors) + .to include 'Key config should be a string or symbol' + end + end + + context 'when there is an unknown key present' do + let(:config) { { invalid: true } } + + it 'reports error with descendants' do + expect(entry.errors) + .to include 'Cache config contains unknown keys [:invalid]' + end + end + end + end + end +end diff --git a/spec/lib/gitlab/ci/config/node/configurable_spec.rb b/spec/lib/gitlab/ci/config/node/configurable_spec.rb index 2ac436cb4b2..4a1550517fb 100644 --- a/spec/lib/gitlab/ci/config/node/configurable_spec.rb +++ b/spec/lib/gitlab/ci/config/node/configurable_spec.rb @@ -7,6 +7,39 @@ describe Gitlab::Ci::Config::Node::Configurable do node.include(described_class) end + describe 'validations' do + let(:validator) { node.validator.new(instance) } + + before do + node.class_eval do + attr_reader :config + + def initialize(config) + @config = config + end + end + + validator.validate + end + + + context 'when node validator is invalid' do + let(:instance) { node.new('ls') } + + it 'returns invalid validator' do + expect(validator).to be_invalid + end + end + + context 'when node instance is valid' do + let(:instance) { node.new(key: 'value') } + + it 'returns valid validator' do + expect(validator).to be_valid + end + end + end + describe 'configured nodes' do before do node.class_eval do |