From d501850e05ebadcbf2f957cbf35a0ffa6dbe31ff Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Jun 2016 14:20:34 +0200 Subject: [PATCH] Add gitlab ci configuration class that holds hash As for now, we keep this class inside a oryginal config processor class. We will move implementation to this class and delegate to it from current config processor. After original gitlab ci yaml processor not longer has relevant impelemntation we will replace it with new configuration class. --- lib/ci/gitlab_ci_yaml_processor.rb | 10 +++------ lib/gitlab/ci/config.rb | 21 ++++++++++++++++++ spec/lib/gitlab/ci/config_spec.rb | 34 ++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 lib/gitlab/ci/config.rb create mode 100644 spec/lib/gitlab/ci/config_spec.rb diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 026a5ac97ca..9a60c5ab842 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -12,18 +12,14 @@ module Ci attr_reader :before_script, :after_script, :image, :services, :path, :cache def initialize(config, path = nil) - @config = YAML.safe_load(config, [Symbol], [], true) + @config = Gitlab::Ci::Config.new(config).to_hash @path = path - unless @config.is_a? Hash - raise ValidationError, "YAML should be a hash" - end - - @config = @config.deep_symbolize_keys - initial_parsing validate! + rescue Gitlab::Ci::Config::ParserError => e + raise ValidationError, e.message end def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb new file mode 100644 index 00000000000..8f88ccf5bf4 --- /dev/null +++ b/lib/gitlab/ci/config.rb @@ -0,0 +1,21 @@ +module Gitlab + module Ci + class Config + class ParserError < StandardError; end + + def initialize(config) + @config = YAML.safe_load(config, [Symbol], [], true) + + unless @config.is_a?(Hash) + raise ParserError, 'YAML should be a hash' + end + + @config = @config.deep_symbolize_keys + end + + def to_hash + @config + end + end + end +end diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb new file mode 100644 index 00000000000..6e251706714 --- /dev/null +++ b/spec/lib/gitlab/ci/config_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe Gitlab::Ci::Config do + let(:config) do + described_class.new(yml) + end + + context 'when yml config is valid' do + let(:yml) do + <<-EOS + image: ruby:2.2 + + rspec: + script: + - gem install rspec + - rspec + EOS + end + + describe '#to_hash' do + it 'returns hash created from string' do + hash = { + image: 'ruby:2.2', + rspec: { + script: ['gem install rspec', + 'rspec'] + } + } + + expect(config.to_hash).to eq hash + end + end + end +end