From d501850e05ebadcbf2f957cbf35a0ffa6dbe31ff Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Jun 2016 14:20:34 +0200 Subject: 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 -- cgit v1.2.1 From d2b708ac43b0810ea2ce4de196ce46692e536027 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 3 Jun 2016 20:54:33 +0200 Subject: Extract CI config YAML parser to a separate class With this approach it would be easier to add different sources of configuration, that we do not necessairly have to be in YAML format. --- lib/gitlab/ci/config.rb | 8 ++--- lib/gitlab/ci/config/parser.rb | 25 +++++++++++++++ spec/lib/gitlab/ci/config/parser_spec.rb | 54 ++++++++++++++++++++++++++++++++ spec/lib/gitlab/ci/config_spec.rb | 14 ++++++++- 4 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 lib/gitlab/ci/config/parser.rb create mode 100644 spec/lib/gitlab/ci/config/parser_spec.rb diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index 8f88ccf5bf4..0baefa70f61 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -4,13 +4,13 @@ module Gitlab class ParserError < StandardError; end def initialize(config) - @config = YAML.safe_load(config, [Symbol], [], true) + parser = Parser.new(config) - unless @config.is_a?(Hash) - raise ParserError, 'YAML should be a hash' + unless parser.valid? + raise ParserError, 'Invalid configuration format!' end - @config = @config.deep_symbolize_keys + @config = parser.parse end def to_hash diff --git a/lib/gitlab/ci/config/parser.rb b/lib/gitlab/ci/config/parser.rb new file mode 100644 index 00000000000..6e1b7ec8267 --- /dev/null +++ b/lib/gitlab/ci/config/parser.rb @@ -0,0 +1,25 @@ +module Gitlab + module Ci + class Config + class Parser + class FormatError < StandardError; end + + def initialize(config) + @config = YAML.safe_load(config, [Symbol], [], true) + end + + def valid? + @config.is_a?(Hash) + end + + def parse + unless valid? + raise FormatError, 'Invalid configuration format' + end + + @config.deep_symbolize_keys + end + end + end + end +end diff --git a/spec/lib/gitlab/ci/config/parser_spec.rb b/spec/lib/gitlab/ci/config/parser_spec.rb new file mode 100644 index 00000000000..b35e66cde51 --- /dev/null +++ b/spec/lib/gitlab/ci/config/parser_spec.rb @@ -0,0 +1,54 @@ +require 'spec_helper' + +describe Gitlab::Ci::Config::Parser do + let(:parser) { described_class.new(yml) } + + context 'when yaml syntax is correct' do + let(:yml) { 'image: ruby:2.2' } + + describe '#valid?' do + it 'returns true' do + expect(parser.valid?).to be true + end + end + + describe '#parse' do + it 'returns a hash' do + expect(parser.parse).to be_a Hash + end + + it 'returns a valid hash' do + expect(parser.parse).to eq(image: 'ruby:2.2') + end + end + end + + context 'when yaml syntax is incorrect' do + let(:yml) { '// incorrect' } + + describe '#valid?' do + it 'returns false' do + expect(parser.valid?).to be false + end + end + + describe '#parse' do + it 'raises error' do + expect { parser.parse }.to raise_error( + Gitlab::Ci::Config::Parser::FormatError, + 'Invalid configuration format' + ) + end + end + end + + context 'when yaml config is empty' do + let(:yml) { '' } + + describe '#valid?' do + it 'returns false' do + expect(parser.valid?).to be false + end + end + end +end diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb index 6e251706714..691c1ee8ba7 100644 --- a/spec/lib/gitlab/ci/config_spec.rb +++ b/spec/lib/gitlab/ci/config_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::Ci::Config do described_class.new(yml) end - context 'when yml config is valid' do + context 'when config is valid' do let(:yml) do <<-EOS image: ruby:2.2 @@ -30,5 +30,17 @@ describe Gitlab::Ci::Config do expect(config.to_hash).to eq hash end end + + context 'when config is invalid' do + let(:yml) { '// invalid' } + + describe '.new' do + it 'raises error' do + expect { config }.to raise_error( + Gitlab::Ci::Config::ParserError, /Invalid configuration format/ + ) + end + end + end end end -- cgit v1.2.1 From 23030439c2cf3b3ad48099eb9a4371b8bf55066f Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 6 Jun 2016 08:20:55 +0200 Subject: Rename class that loads CI configuration to Loader --- lib/ci/gitlab_ci_yaml_processor.rb | 2 +- lib/gitlab/ci/config.rb | 10 +++--- lib/gitlab/ci/config/loader.rb | 25 +++++++++++++++ lib/gitlab/ci/config/parser.rb | 25 --------------- spec/lib/gitlab/ci/config/loader_spec.rb | 50 +++++++++++++++++++++++++++++ spec/lib/gitlab/ci/config/parser_spec.rb | 54 -------------------------------- spec/lib/gitlab/ci/config_spec.rb | 2 +- 7 files changed, 82 insertions(+), 86 deletions(-) create mode 100644 lib/gitlab/ci/config/loader.rb delete mode 100644 lib/gitlab/ci/config/parser.rb create mode 100644 spec/lib/gitlab/ci/config/loader_spec.rb delete mode 100644 spec/lib/gitlab/ci/config/parser_spec.rb diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 9a60c5ab842..46a923161c8 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -18,7 +18,7 @@ module Ci initial_parsing validate! - rescue Gitlab::Ci::Config::ParserError => e + rescue Gitlab::Ci::Config::LoaderError => e raise ValidationError, e.message end diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index 0baefa70f61..5fc4894311f 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -1,16 +1,16 @@ module Gitlab module Ci class Config - class ParserError < StandardError; end + class LoaderError < StandardError; end def initialize(config) - parser = Parser.new(config) + loader = Loader.new(config) - unless parser.valid? - raise ParserError, 'Invalid configuration format!' + unless loader.valid? + raise LoaderError, 'Invalid configuration format!' end - @config = parser.parse + @config = loader.load end def to_hash diff --git a/lib/gitlab/ci/config/loader.rb b/lib/gitlab/ci/config/loader.rb new file mode 100644 index 00000000000..ed9cc16702c --- /dev/null +++ b/lib/gitlab/ci/config/loader.rb @@ -0,0 +1,25 @@ +module Gitlab + module Ci + class Config + class Loader + class FormatError < StandardError; end + + def initialize(config) + @config = YAML.safe_load(config, [Symbol], [], true) + end + + def valid? + @config.is_a?(Hash) + end + + def load + unless valid? + raise FormatError, 'Invalid configuration format' + end + + @config.deep_symbolize_keys + end + end + end + end +end diff --git a/lib/gitlab/ci/config/parser.rb b/lib/gitlab/ci/config/parser.rb deleted file mode 100644 index 6e1b7ec8267..00000000000 --- a/lib/gitlab/ci/config/parser.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Gitlab - module Ci - class Config - class Parser - class FormatError < StandardError; end - - def initialize(config) - @config = YAML.safe_load(config, [Symbol], [], true) - end - - def valid? - @config.is_a?(Hash) - end - - def parse - unless valid? - raise FormatError, 'Invalid configuration format' - end - - @config.deep_symbolize_keys - end - end - end - end -end diff --git a/spec/lib/gitlab/ci/config/loader_spec.rb b/spec/lib/gitlab/ci/config/loader_spec.rb new file mode 100644 index 00000000000..6f1a10085dd --- /dev/null +++ b/spec/lib/gitlab/ci/config/loader_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Gitlab::Ci::Config::Loader do + let(:loader) { described_class.new(yml) } + + context 'when yaml syntax is correct' do + let(:yml) { 'image: ruby:2.2' } + + describe '#valid?' do + it 'returns true' do + expect(loader.valid?).to be true + end + end + + describe '#load' do + it 'returns a valid hash' do + expect(loader.load).to eq(image: 'ruby:2.2') + end + end + end + + context 'when yaml syntax is incorrect' do + let(:yml) { '// incorrect' } + + describe '#valid?' do + it 'returns false' do + expect(loader.valid?).to be false + end + end + + describe '#load' do + it 'raises error' do + expect { loader.load }.to raise_error( + Gitlab::Ci::Config::Loader::FormatError, + 'Invalid configuration format' + ) + end + end + end + + context 'when yaml config is empty' do + let(:yml) { '' } + + describe '#valid?' do + it 'returns false' do + expect(loader.valid?).to be false + end + end + end +end diff --git a/spec/lib/gitlab/ci/config/parser_spec.rb b/spec/lib/gitlab/ci/config/parser_spec.rb deleted file mode 100644 index b35e66cde51..00000000000 --- a/spec/lib/gitlab/ci/config/parser_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Ci::Config::Parser do - let(:parser) { described_class.new(yml) } - - context 'when yaml syntax is correct' do - let(:yml) { 'image: ruby:2.2' } - - describe '#valid?' do - it 'returns true' do - expect(parser.valid?).to be true - end - end - - describe '#parse' do - it 'returns a hash' do - expect(parser.parse).to be_a Hash - end - - it 'returns a valid hash' do - expect(parser.parse).to eq(image: 'ruby:2.2') - end - end - end - - context 'when yaml syntax is incorrect' do - let(:yml) { '// incorrect' } - - describe '#valid?' do - it 'returns false' do - expect(parser.valid?).to be false - end - end - - describe '#parse' do - it 'raises error' do - expect { parser.parse }.to raise_error( - Gitlab::Ci::Config::Parser::FormatError, - 'Invalid configuration format' - ) - end - end - end - - context 'when yaml config is empty' do - let(:yml) { '' } - - describe '#valid?' do - it 'returns false' do - expect(parser.valid?).to be false - end - end - end -end diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb index 691c1ee8ba7..52aafbcaaa6 100644 --- a/spec/lib/gitlab/ci/config_spec.rb +++ b/spec/lib/gitlab/ci/config_spec.rb @@ -37,7 +37,7 @@ describe Gitlab::Ci::Config do describe '.new' do it 'raises error' do expect { config }.to raise_error( - Gitlab::Ci::Config::ParserError, /Invalid configuration format/ + Gitlab::Ci::Config::LoaderError, /Invalid configuration format/ ) end end -- cgit v1.2.1 From fa097c678cdfead0dc1344e6d32569266da53465 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Jun 2016 10:26:38 +0200 Subject: Remove duplicated exception in Ci config This is a temporary refactoring stub, that is planned to be removed after removing legacy config processor. --- lib/ci/gitlab_ci_yaml_processor.rb | 2 +- lib/gitlab/ci/config.rb | 5 ----- spec/lib/gitlab/ci/config_spec.rb | 3 ++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 46a923161c8..130f5b0892e 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -18,7 +18,7 @@ module Ci initial_parsing validate! - rescue Gitlab::Ci::Config::LoaderError => e + rescue Gitlab::Ci::Config::Loader::FormatError => e raise ValidationError, e.message end diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index 5fc4894311f..b6ce791c0ff 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -5,11 +5,6 @@ module Gitlab def initialize(config) loader = Loader.new(config) - - unless loader.valid? - raise LoaderError, 'Invalid configuration format!' - end - @config = loader.load end diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb index 52aafbcaaa6..4d46abe520f 100644 --- a/spec/lib/gitlab/ci/config_spec.rb +++ b/spec/lib/gitlab/ci/config_spec.rb @@ -37,7 +37,8 @@ describe Gitlab::Ci::Config do describe '.new' do it 'raises error' do expect { config }.to raise_error( - Gitlab::Ci::Config::LoaderError, /Invalid configuration format/ + Gitlab::Ci::Config::Loader::FormatError, + /Invalid configuration format/ ) end end -- cgit v1.2.1 From 5ef104df59211b022ed42e38e1cdbe950ff54388 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Jun 2016 12:53:46 +0200 Subject: Improve Ci config loader by changing method signature --- lib/gitlab/ci/config.rb | 2 +- lib/gitlab/ci/config/loader.rb | 2 +- spec/lib/gitlab/ci/config/loader_spec.rb | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index b6ce791c0ff..ffe633d4b63 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -5,7 +5,7 @@ module Gitlab def initialize(config) loader = Loader.new(config) - @config = loader.load + @config = loader.load! end def to_hash diff --git a/lib/gitlab/ci/config/loader.rb b/lib/gitlab/ci/config/loader.rb index ed9cc16702c..dbf6eb0edbe 100644 --- a/lib/gitlab/ci/config/loader.rb +++ b/lib/gitlab/ci/config/loader.rb @@ -12,7 +12,7 @@ module Gitlab @config.is_a?(Hash) end - def load + def load! unless valid? raise FormatError, 'Invalid configuration format' end diff --git a/spec/lib/gitlab/ci/config/loader_spec.rb b/spec/lib/gitlab/ci/config/loader_spec.rb index 6f1a10085dd..2d44b1f60f1 100644 --- a/spec/lib/gitlab/ci/config/loader_spec.rb +++ b/spec/lib/gitlab/ci/config/loader_spec.rb @@ -12,9 +12,9 @@ describe Gitlab::Ci::Config::Loader do end end - describe '#load' do + describe '#load!' do it 'returns a valid hash' do - expect(loader.load).to eq(image: 'ruby:2.2') + expect(loader.load!).to eq(image: 'ruby:2.2') end end end @@ -28,9 +28,9 @@ describe Gitlab::Ci::Config::Loader do end end - describe '#load' do + describe '#load!' do it 'raises error' do - expect { loader.load }.to raise_error( + expect { loader.load! }.to raise_error( Gitlab::Ci::Config::Loader::FormatError, 'Invalid configuration format' ) -- cgit v1.2.1