summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-02-23 10:41:10 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-02-23 10:41:10 +0100
commit227e18ea43eed473e30f9e4ae6e1b150e600f903 (patch)
treeeae0dac34e485ea3a80a0bbf6db19e9ab6fabae1
parent8c7374cafcfe77f880d45f32ff11b38d257f5373 (diff)
downloadgitlab-ce-227e18ea43eed473e30f9e4ae6e1b150e600f903.tar.gz
Add support for evaluating pipeline expression variables
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/equals.rb2
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/null.rb6
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/string.rb2
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/variable.rb3
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexer.rb1
-rw-r--r--lib/gitlab/ci/pipeline/expression/statement.rb4
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb20
7 files changed, 32 insertions, 6 deletions
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/equals.rb b/lib/gitlab/ci/pipeline/expression/lexeme/equals.rb
index b499d41a509..18e4db49eee 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/equals.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/equals.rb
@@ -11,7 +11,7 @@ module Gitlab
@right = right
end
- def evaluate(**variables)
+ def evaluate(variables)
@left.evaluate(variables) == @right.evaluate(variables)
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/null.rb b/lib/gitlab/ci/pipeline/expression/lexeme/null.rb
index 5bf06a9eee2..b62e72cde2a 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/null.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/null.rb
@@ -10,9 +10,13 @@ module Gitlab
@value = value
end
- def evaluate(**_)
+ def evaluate(_)
nil
end
+
+ def self.build(value)
+ new(value)
+ end
end
end
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/string.rb b/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
index 6f77d443c3c..d655b029315 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
@@ -10,7 +10,7 @@ module Gitlab
@value = value
end
- def evaluate(**_)
+ def evaluate(_)
@value.to_s
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/variable.rb b/lib/gitlab/ci/pipeline/expression/lexeme/variable.rb
index 01eea6b19a6..ccf1fdfae2c 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/variable.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/variable.rb
@@ -10,7 +10,8 @@ module Gitlab
@name = name
end
- def evaluate(**variables)
+ def evaluate(variables)
+ variables[@name]
end
def self.build(string)
diff --git a/lib/gitlab/ci/pipeline/expression/lexer.rb b/lib/gitlab/ci/pipeline/expression/lexer.rb
index a0d1d7cd87d..067ad5fd312 100644
--- a/lib/gitlab/ci/pipeline/expression/lexer.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexer.rb
@@ -6,6 +6,7 @@ module Gitlab
LEXEMES = [
Expression::Lexeme::Variable,
Expression::Lexeme::String,
+ Expression::Lexeme::Null,
Expression::Lexeme::Equals
].freeze
diff --git a/lib/gitlab/ci/pipeline/expression/statement.rb b/lib/gitlab/ci/pipeline/expression/statement.rb
index cb76bc00764..4f0e101b730 100644
--- a/lib/gitlab/ci/pipeline/expression/statement.rb
+++ b/lib/gitlab/ci/pipeline/expression/statement.rb
@@ -18,7 +18,7 @@ module Gitlab
@lexer = Expression::Lexer.new(statement)
@variables = pipeline.variables.map do |variable|
- { variable.key => variable.value }
+ [variable.key, variable.value]
end
end
@@ -33,7 +33,7 @@ module Gitlab
end
def evaluate
- parse_tree.evaluate(**@variables)
+ parse_tree.evaluate(@variables.to_h)
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
index e8a1fc0579e..9a35d71c658 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
@@ -60,4 +60,24 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
end
end
end
+
+ describe '#evaluate' do
+ statements = [
+ ['$VARIABLE == "my variable"', true],
+ ['"my variable" == $VARIABLE', true],
+ ['$VARIABLE == null', false],
+ ['$VAR == null', true],
+ ['null == $VAR', true],
+ ['$VARIABLE', 'my variable'],
+ ['$VAR', nil],
+ ]
+
+ statements.each do |expression, value|
+ it "evaluates `#{expression}` to `#{value}`" do
+ statement = described_class.new(expression, pipeline)
+
+ expect(statement.evaluate).to eq value
+ end
+ end
+ end
end