Move pipeline expression lexemes to a separate module
This commit is contained in:
parent
5ee43097fd
commit
8517627410
15 changed files with 138 additions and 128 deletions
|
@ -1,25 +0,0 @@
|
||||||
module Gitlab
|
|
||||||
module Ci
|
|
||||||
module Pipeline
|
|
||||||
module Expression
|
|
||||||
class Equals < Expression::Lexeme
|
|
||||||
PATTERN = /==/.freeze
|
|
||||||
TYPE = :operator
|
|
||||||
|
|
||||||
def initialize(left, right)
|
|
||||||
@left = left
|
|
||||||
@right = right
|
|
||||||
end
|
|
||||||
|
|
||||||
def evaluate(**variables)
|
|
||||||
@left.evaluate(variables) == @right.evaluate(variables)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.build(value, behind, ahead)
|
|
||||||
new(behind, ahead)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,27 +0,0 @@
|
||||||
module Gitlab
|
|
||||||
module Ci
|
|
||||||
module Pipeline
|
|
||||||
module Expression
|
|
||||||
class Lexeme
|
|
||||||
def evaluate(**variables)
|
|
||||||
raise NotImplementedError
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.build(token)
|
|
||||||
raise NotImplementedError
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.type
|
|
||||||
self::TYPE
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.scan(scanner)
|
|
||||||
if scanner.scan(self::PATTERN)
|
|
||||||
Expression::Token.new(scanner.matched, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
29
lib/gitlab/ci/pipeline/expression/lexeme/base.rb
Normal file
29
lib/gitlab/ci/pipeline/expression/lexeme/base.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
module Gitlab
|
||||||
|
module Ci
|
||||||
|
module Pipeline
|
||||||
|
module Expression
|
||||||
|
module Lexeme
|
||||||
|
class Base
|
||||||
|
def evaluate(**variables)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.build(token)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.type
|
||||||
|
self::TYPE
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.scan(scanner)
|
||||||
|
if scanner.scan(self::PATTERN)
|
||||||
|
Expression::Token.new(scanner.matched, self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
27
lib/gitlab/ci/pipeline/expression/lexeme/equals.rb
Normal file
27
lib/gitlab/ci/pipeline/expression/lexeme/equals.rb
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
module Gitlab
|
||||||
|
module Ci
|
||||||
|
module Pipeline
|
||||||
|
module Expression
|
||||||
|
module Lexeme
|
||||||
|
class Equals < Lexeme::Base
|
||||||
|
PATTERN = /==/.freeze
|
||||||
|
TYPE = :operator
|
||||||
|
|
||||||
|
def initialize(left, right)
|
||||||
|
@left = left
|
||||||
|
@right = right
|
||||||
|
end
|
||||||
|
|
||||||
|
def evaluate(**variables)
|
||||||
|
@left.evaluate(variables) == @right.evaluate(variables)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.build(_value, behind, ahead)
|
||||||
|
new(behind, ahead)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
22
lib/gitlab/ci/pipeline/expression/lexeme/null.rb
Normal file
22
lib/gitlab/ci/pipeline/expression/lexeme/null.rb
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
module Gitlab
|
||||||
|
module Ci
|
||||||
|
module Pipeline
|
||||||
|
module Expression
|
||||||
|
module Lexeme
|
||||||
|
class Null < Lexeme::Base
|
||||||
|
PATTERN = /null/.freeze
|
||||||
|
TYPE = :value
|
||||||
|
|
||||||
|
def initialize(value = nil)
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
def evaluate(**_)
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
26
lib/gitlab/ci/pipeline/expression/lexeme/string.rb
Normal file
26
lib/gitlab/ci/pipeline/expression/lexeme/string.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
module Gitlab
|
||||||
|
module Ci
|
||||||
|
module Pipeline
|
||||||
|
module Expression
|
||||||
|
module Lexeme
|
||||||
|
class String < Lexeme::Base
|
||||||
|
PATTERN = /"(?<string>.+?)"/.freeze
|
||||||
|
TYPE = :value
|
||||||
|
|
||||||
|
def initialize(value)
|
||||||
|
@value = value
|
||||||
|
end
|
||||||
|
|
||||||
|
def evaluate(**_)
|
||||||
|
@value.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.build(string)
|
||||||
|
new(string.match(PATTERN)[:string])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
25
lib/gitlab/ci/pipeline/expression/lexeme/variable.rb
Normal file
25
lib/gitlab/ci/pipeline/expression/lexeme/variable.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
module Gitlab
|
||||||
|
module Ci
|
||||||
|
module Pipeline
|
||||||
|
module Expression
|
||||||
|
module Lexeme
|
||||||
|
class Variable < Lexeme::Base
|
||||||
|
PATTERN = /\$(?<name>\w+)/.freeze
|
||||||
|
TYPE = :value
|
||||||
|
|
||||||
|
def initialize(name)
|
||||||
|
@name = name
|
||||||
|
end
|
||||||
|
|
||||||
|
def evaluate(**variables)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.build(string)
|
||||||
|
new(string.match(PATTERN)[:name])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,9 +4,9 @@ module Gitlab
|
||||||
module Expression
|
module Expression
|
||||||
class Lexer
|
class Lexer
|
||||||
LEXEMES = [
|
LEXEMES = [
|
||||||
Expression::Variable,
|
Expression::Lexeme::Variable,
|
||||||
Expression::String,
|
Expression::Lexeme::String,
|
||||||
Expression::Equals
|
Expression::Lexeme::Equals
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
MAX_CYCLES = 5
|
MAX_CYCLES = 5
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
module Gitlab
|
|
||||||
module Ci
|
|
||||||
module Pipeline
|
|
||||||
module Expression
|
|
||||||
class Null < Expression::Lexeme
|
|
||||||
PATTERN = /null/.freeze
|
|
||||||
TYPE = :value
|
|
||||||
|
|
||||||
def initialize(value = nil)
|
|
||||||
@value = value
|
|
||||||
end
|
|
||||||
|
|
||||||
def evaluate(**_)
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -22,7 +22,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
rescue StopIteration
|
rescue StopIteration
|
||||||
@nodes.last || Expression::Null.new
|
@nodes.last || Expression::Lexeme::Null.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.seed(statement)
|
def self.seed(statement)
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
module Gitlab
|
|
||||||
module Ci
|
|
||||||
module Pipeline
|
|
||||||
module Expression
|
|
||||||
class String < Expression::Lexeme
|
|
||||||
PATTERN = /"(?<string>.+?)"/.freeze
|
|
||||||
TYPE = :value
|
|
||||||
|
|
||||||
def initialize(value)
|
|
||||||
@value = value
|
|
||||||
end
|
|
||||||
|
|
||||||
def evaluate(**_)
|
|
||||||
@value.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.build(string)
|
|
||||||
new(string.match(PATTERN)[:string])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,23 +0,0 @@
|
||||||
module Gitlab
|
|
||||||
module Ci
|
|
||||||
module Pipeline
|
|
||||||
module Expression
|
|
||||||
class Variable < Expression::Lexeme
|
|
||||||
PATTERN = /\$(?<name>\w+)/.freeze
|
|
||||||
TYPE = :value
|
|
||||||
|
|
||||||
def initialize(name)
|
|
||||||
@name = name
|
|
||||||
end
|
|
||||||
|
|
||||||
def evaluate(**variables)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.build(string)
|
|
||||||
new(string.match(PATTERN)[:name])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -5,21 +5,21 @@ describe Gitlab::Ci::Pipeline::Expression::Parser do
|
||||||
context 'when using operators' do
|
context 'when using operators' do
|
||||||
it 'returns a reverse descent parse tree' do
|
it 'returns a reverse descent parse tree' do
|
||||||
expect(described_class.seed('$VAR1 == "123" == $VAR2').tree)
|
expect(described_class.seed('$VAR1 == "123" == $VAR2').tree)
|
||||||
.to be_a Gitlab::Ci::Pipeline::Expression::Equals
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Equals
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when using a single token' do
|
context 'when using a single token' do
|
||||||
it 'returns a single token instance' do
|
it 'returns a single token instance' do
|
||||||
expect(described_class.seed('$VAR').tree)
|
expect(described_class.seed('$VAR').tree)
|
||||||
.to be_a Gitlab::Ci::Pipeline::Expression::Variable
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Variable
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when expression is empty' do
|
context 'when expression is empty' do
|
||||||
it 'returns a null token' do
|
it 'returns a null token' do
|
||||||
expect(described_class.seed('').tree)
|
expect(described_class.seed('').tree)
|
||||||
.to be_a Gitlab::Ci::Pipeline::Expression::Null
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Null
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -37,7 +37,7 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
|
||||||
|
|
||||||
it 'returns a reverse descent parse tree' do
|
it 'returns a reverse descent parse tree' do
|
||||||
expect(subject.parse_tree)
|
expect(subject.parse_tree)
|
||||||
.to be_a Gitlab::Ci::Pipeline::Expression::Equals
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Equals
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ describe Gitlab::Ci::Pipeline::Expression::Statement do
|
||||||
|
|
||||||
it 'returns a single token instance' do
|
it 'returns a single token instance' do
|
||||||
expect(subject.parse_tree)
|
expect(subject.parse_tree)
|
||||||
.to be_a Gitlab::Ci::Pipeline::Expression::Variable
|
.to be_a Gitlab::Ci::Pipeline::Expression::Lexeme::Variable
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue