Add support for pattern matching in variables expressions
This commit is contained in:
parent
475d2edf04
commit
65f4e7b2a1
7 changed files with 27 additions and 7 deletions
|
@ -15,7 +15,7 @@ module Gitlab
|
|||
text = @left.evaluate(variables)
|
||||
regexp = @right.evaluate(variables)
|
||||
|
||||
regexp.scan(text).any?
|
||||
regexp.scan(text.to_s).any?
|
||||
end
|
||||
|
||||
def self.build(_value, behind, ahead)
|
||||
|
|
|
@ -3,6 +3,8 @@ module Gitlab
|
|||
module Pipeline
|
||||
module Expression
|
||||
module Lexeme
|
||||
require_dependency 're2'
|
||||
|
||||
class Pattern < Lexeme::Value
|
||||
PATTERN = %r{/(?<regexp>.+)/}.freeze
|
||||
|
||||
|
|
|
@ -10,8 +10,10 @@ module Gitlab
|
|||
LEXEMES = [
|
||||
Expression::Lexeme::Variable,
|
||||
Expression::Lexeme::String,
|
||||
Expression::Lexeme::Pattern,
|
||||
Expression::Lexeme::Null,
|
||||
Expression::Lexeme::Equals
|
||||
Expression::Lexeme::Equals,
|
||||
Expression::Lexeme::Matches
|
||||
].freeze
|
||||
|
||||
MAX_TOKENS = 100
|
||||
|
|
|
@ -6,12 +6,14 @@ module Gitlab
|
|||
StatementError = Class.new(Expression::ExpressionError)
|
||||
|
||||
GRAMMAR = [
|
||||
%w[variable],
|
||||
%w[variable equals string],
|
||||
%w[variable equals variable],
|
||||
%w[variable equals null],
|
||||
%w[string equals variable],
|
||||
%w[null equals variable],
|
||||
%w[variable]
|
||||
%w[variable matches pattern],
|
||||
%w[pattern matches variable]
|
||||
].freeze
|
||||
|
||||
def initialize(statement, variables = {})
|
||||
|
|
|
@ -39,6 +39,16 @@ describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
|
|||
expect(operator.evaluate).to eq true
|
||||
end
|
||||
|
||||
it 'supports matching against a nil value' do
|
||||
allow(left).to receive(:evaluate).and_return(nil)
|
||||
allow(right).to receive(:evaluate)
|
||||
.and_return(Gitlab::UntrustedRegexp.new('pattern'))
|
||||
|
||||
operator = described_class.new(left, right)
|
||||
|
||||
expect(operator.evaluate).to eq false
|
||||
end
|
||||
|
||||
it 'supports multiline strings' do
|
||||
allow(left).to receive(:evaluate).and_return <<~TEXT
|
||||
My awesome contents
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
require 'fast_spec_helper'
|
||||
require_dependency 're2'
|
||||
|
||||
describe Gitlab::Ci::Pipeline::Expression::Lexeme::Pattern do
|
||||
describe '.build' do
|
||||
|
|
|
@ -84,7 +84,6 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
|
|||
describe '#evaluate' do
|
||||
statements = [
|
||||
['$PRESENT_VARIABLE == "my variable"', true],
|
||||
["$PRESENT_VARIABLE == 'my variable'", true],
|
||||
['"my variable" == $PRESENT_VARIABLE', true],
|
||||
['$PRESENT_VARIABLE == null', false],
|
||||
['$EMPTY_VARIABLE == null', false],
|
||||
|
@ -93,7 +92,11 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
|
|||
['$UNDEFINED_VARIABLE == null', true],
|
||||
['null == $UNDEFINED_VARIABLE', true],
|
||||
['$PRESENT_VARIABLE', 'my variable'],
|
||||
['$UNDEFINED_VARIABLE', nil]
|
||||
['$UNDEFINED_VARIABLE', nil],
|
||||
["$PRESENT_VARIABLE =~ /var.*e$/", true],
|
||||
["$PRESENT_VARIABLE =~ /^var.*/", false],
|
||||
["$EMPTY_VARIABLE =~ /var.*/", false],
|
||||
["$UNDEFINED_VARIABLE =~ /var.*/", false]
|
||||
]
|
||||
|
||||
statements.each do |expression, value|
|
||||
|
@ -115,7 +118,9 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
|
|||
['$PRESENT_VARIABLE', true],
|
||||
['$UNDEFINED_VARIABLE', false],
|
||||
['$EMPTY_VARIABLE', false],
|
||||
['$INVALID = 1', false]
|
||||
['$INVALID = 1', false],
|
||||
["$PRESENT_VARIABLE =~ /var.*/", true],
|
||||
["$UNDEFINED_VARIABLE =~ /var.*/", false]
|
||||
]
|
||||
|
||||
statements.each do |expression, value|
|
||||
|
|
Loading…
Reference in a new issue