cucumber-expressions 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cucumber-expressions.gemspec +1 -1
- data/lib/cucumber/cucumber_expressions/argument.rb +8 -8
- data/lib/cucumber/cucumber_expressions/cucumber_expression.rb +16 -8
- data/lib/cucumber/cucumber_expressions/errors.rb +1 -1
- data/lib/cucumber/cucumber_expressions/group.rb +6 -54
- data/lib/cucumber/cucumber_expressions/group_builder.rb +36 -0
- data/lib/cucumber/cucumber_expressions/parameter_type_registry.rb +2 -2
- data/lib/cucumber/cucumber_expressions/regular_expression.rb +13 -3
- data/lib/cucumber/cucumber_expressions/tree_regexp.rb +46 -0
- data/spec/cucumber/cucumber_expressions/cucumber_expression_regexp_spec.rb +2 -2
- data/spec/cucumber/cucumber_expressions/parameter_type_registry_spec.rb +2 -2
- data/spec/cucumber/cucumber_expressions/regular_expression_spec.rb +8 -6
- data/spec/cucumber/cucumber_expressions/tree_regexp_spec.rb +60 -0
- metadata +7 -5
- data/spec/cucumber/cucumber_expressions/group_spec.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d24725b82e154836aede4e4bb39e1c80ec664f0b
|
4
|
+
data.tar.gz: 91b3cc77505a06fd4ae831217b1ffe0155d33c14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0450cd7e01c19b67ebbb1e4611340de9507ff2b7680bc2e07ba3a7d23ac39a0c18e528165e1ae61db2140329b85a1c3d452c6823f27eaec8a9422d2f71add4c
|
7
|
+
data.tar.gz: 49566f903a663bbbdc91ac517fe3a94340f6b333b417d19d1b6834cc149ace78da849ed9c8629315e1c349638f49bb4ff71ae1a51e72de7bb773491fe0093686
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = 'cucumber-expressions'
|
4
|
-
s.version = '4.0.
|
4
|
+
s.version = '4.0.1'
|
5
5
|
s.authors = ["Aslak Hellesøy"]
|
6
6
|
s.description = 'Cucumber Expressions - a simpler alternative to Regular Expressions'
|
7
7
|
s.summary = "cucumber-expressions-#{s.version}"
|
@@ -4,16 +4,17 @@ require 'cucumber/cucumber_expressions/errors'
|
|
4
4
|
module Cucumber
|
5
5
|
module CucumberExpressions
|
6
6
|
class Argument
|
7
|
-
|
8
|
-
m = regexp.match(text)
|
9
|
-
return nil if m.nil?
|
7
|
+
attr_reader :group
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
def self.build(tree_regexp, text, parameter_types)
|
10
|
+
group = tree_regexp.match(text)
|
11
|
+
return nil if group.nil?
|
12
|
+
|
13
|
+
arg_groups = group.children
|
13
14
|
|
14
15
|
if arg_groups.length != parameter_types.length
|
15
|
-
raise
|
16
|
-
"Expression has #{arg_groups.length}
|
16
|
+
raise CucumberExpressionError.new(
|
17
|
+
"Expression #{tree_regexp.regexp.inspect} has #{arg_groups.length} capture groups (#{arg_groups.map(&:value)}), but there were #{parameter_types.length} parameter types (#{parameter_types.map(&:name)})"
|
17
18
|
)
|
18
19
|
end
|
19
20
|
|
@@ -23,7 +24,6 @@ module Cucumber
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def initialize(group, parameter_type)
|
26
|
-
raise "WTF" if Array === group
|
27
27
|
@group, @parameter_type = group, parameter_type
|
28
28
|
end
|
29
29
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/argument'
|
2
|
-
require 'cucumber/cucumber_expressions/
|
2
|
+
require 'cucumber/cucumber_expressions/tree_regexp'
|
3
3
|
require 'cucumber/cucumber_expressions/errors'
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
module CucumberExpressions
|
7
7
|
class CucumberExpression
|
8
|
-
PARAMETER_REGEXP =
|
8
|
+
PARAMETER_REGEXP = /{([^}]+)}/
|
9
9
|
OPTIONAL_REGEXP = /\(([^)]+)\)/
|
10
10
|
ALTERNATIVE_WORD_REGEXP = /([[:alpha:]]+)((\/[[:alpha:]]+)+)/
|
11
11
|
|
@@ -14,7 +14,7 @@ module Cucumber
|
|
14
14
|
def initialize(expression, parameter_type_registry)
|
15
15
|
@source = expression
|
16
16
|
@parameter_types = []
|
17
|
-
regexp =
|
17
|
+
regexp = '^'
|
18
18
|
match_offset = 0
|
19
19
|
|
20
20
|
# Escape Does not include (){} because they have special meaning
|
@@ -38,23 +38,31 @@ module Cucumber
|
|
38
38
|
@parameter_types.push(parameter_type)
|
39
39
|
|
40
40
|
text = expression.slice(match_offset...match.offset(0)[0])
|
41
|
-
capture_regexp =
|
41
|
+
capture_regexp = build_capture_regexp(parameter_type.regexps)
|
42
42
|
match_offset = match.offset(0)[1]
|
43
43
|
regexp += text
|
44
44
|
regexp += capture_regexp
|
45
45
|
end
|
46
46
|
regexp += expression.slice(match_offset..-1)
|
47
|
-
regexp +=
|
48
|
-
@
|
47
|
+
regexp += '$'
|
48
|
+
@tree_regexp = TreeRegexp.new(regexp)
|
49
49
|
end
|
50
50
|
|
51
51
|
def match(text)
|
52
|
-
Argument.build(@
|
52
|
+
Argument.build(@tree_regexp, text, @parameter_types)
|
53
|
+
end
|
54
|
+
|
55
|
+
def regexp
|
56
|
+
@tree_regexp.regexp
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_s
|
60
|
+
@source.inspect
|
53
61
|
end
|
54
62
|
|
55
63
|
private
|
56
64
|
|
57
|
-
def
|
65
|
+
def build_capture_regexp(regexps)
|
58
66
|
return "(#{regexps[0]})" if regexps.size == 1
|
59
67
|
capture_groups = regexps.map { |group| "(?:#{group})" }
|
60
68
|
"(#{capture_groups.join('|')})"
|
@@ -21,7 +21,7 @@ I couldn't decide which one to use. You have two options:
|
|
21
21
|
1) Use a Cucumber Expression instead of a Regular Expression. Try one of these:
|
22
22
|
#{expressions(generated_expressions)}
|
23
23
|
|
24
|
-
2) Make one of the parameter types
|
24
|
+
2) Make one of the parameter types preferential and continue to use a Regular Expression.
|
25
25
|
|
26
26
|
EOM
|
27
27
|
end
|
@@ -1,66 +1,18 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module CucumberExpressions
|
3
3
|
class Group
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :value, :start, :end, :children
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
parse(match_data)
|
12
|
-
else
|
13
|
-
@start = args[0] || -1
|
14
|
-
@end = args[1] || -1
|
15
|
-
@value = args[2]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def contains?(group)
|
20
|
-
group.null? || (group.start >= @start && group.end <= @end)
|
21
|
-
end
|
22
|
-
|
23
|
-
def add(group)
|
24
|
-
@children.push(group)
|
25
|
-
end
|
26
|
-
|
27
|
-
def null?
|
28
|
-
@value.nil?
|
6
|
+
def initialize(value, start, _end, children)
|
7
|
+
@value = value
|
8
|
+
@start = start
|
9
|
+
@end = _end
|
10
|
+
@children = children
|
29
11
|
end
|
30
12
|
|
31
13
|
def values
|
32
14
|
(children.empty? ? [self] : children).map(&:value)
|
33
15
|
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def parse(match_data)
|
38
|
-
if match_data.length == 1
|
39
|
-
@start = @end = -1
|
40
|
-
@value = nil
|
41
|
-
return
|
42
|
-
end
|
43
|
-
|
44
|
-
@start = match_data.offset(0)[0]
|
45
|
-
@end = match_data.offset(0)[1]
|
46
|
-
@value = match_data[0]
|
47
|
-
|
48
|
-
stack = []
|
49
|
-
stack.push(self)
|
50
|
-
|
51
|
-
(1...match_data.length).each do |group_index|
|
52
|
-
group = Group.new(
|
53
|
-
match_data.offset(group_index)[0],
|
54
|
-
match_data.offset(group_index)[1],
|
55
|
-
match_data[group_index]
|
56
|
-
)
|
57
|
-
while !stack.last.contains?(group)
|
58
|
-
stack.pop
|
59
|
-
end
|
60
|
-
stack.last.add(group)
|
61
|
-
stack.push(group)
|
62
|
-
end
|
63
|
-
end
|
64
16
|
end
|
65
17
|
end
|
66
18
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/group'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module CucumberExpressions
|
5
|
+
class GroupBuilder
|
6
|
+
def initialize
|
7
|
+
@group_builders = []
|
8
|
+
@capturing = true
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(group_builder)
|
12
|
+
@group_builders.push(group_builder)
|
13
|
+
end
|
14
|
+
|
15
|
+
def build(match, group_indices)
|
16
|
+
group_index = group_indices.next
|
17
|
+
children = @group_builders.map {|gb| gb.build(match, group_indices)}
|
18
|
+
Group.new(match[group_index], match.offset(group_index)[0], match.offset(group_index)[1], children)
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_non_capturing!
|
22
|
+
@capturing = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def capturing?
|
26
|
+
@capturing
|
27
|
+
end
|
28
|
+
|
29
|
+
def move_children_to(group_builder)
|
30
|
+
@group_builders.each do |child|
|
31
|
+
group_builder.add(child)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -6,7 +6,7 @@ module Cucumber
|
|
6
6
|
module CucumberExpressions
|
7
7
|
class ParameterTypeRegistry
|
8
8
|
INTEGER_REGEXPS = [/-?\d+/, /\d+/]
|
9
|
-
FLOAT_REGEXP = /-?\d
|
9
|
+
FLOAT_REGEXP = /-?\d*\.\d+/
|
10
10
|
WORD_REGEXP = /\w+/
|
11
11
|
STRING_REGEXP = /"([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'/
|
12
12
|
|
@@ -50,7 +50,7 @@ module Cucumber
|
|
50
50
|
parameter_type.regexps.each do |parameter_type_regexp|
|
51
51
|
parameter_types = @parameter_types_by_regexp[parameter_type_regexp]
|
52
52
|
if parameter_types.any? && parameter_types[0].prefer_for_regexp_match? && parameter_type.prefer_for_regexp_match?
|
53
|
-
raise CucumberExpressionError.new("There can only be one
|
53
|
+
raise CucumberExpressionError.new("There can only be one preferential parameter type per regexp. The regexp /#{parameter_type_regexp}/ is used for two preferential parameter types, {#{parameter_types[0].name}} and {#{parameter_type.name}}")
|
54
54
|
end
|
55
55
|
parameter_types.push(parameter_type)
|
56
56
|
parameter_types.sort!
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'cucumber/cucumber_expressions/argument'
|
2
2
|
require 'cucumber/cucumber_expressions/parameter_type'
|
3
|
+
require 'cucumber/cucumber_expressions/tree_regexp'
|
3
4
|
|
4
5
|
module Cucumber
|
5
6
|
module CucumberExpressions
|
@@ -9,6 +10,7 @@ module Cucumber
|
|
9
10
|
def initialize(expression_regexp, parameter_type_registry)
|
10
11
|
@expression_regexp = expression_regexp
|
11
12
|
@parameter_type_registry = parameter_type_registry
|
13
|
+
@tree_regexp = TreeRegexp.new(@expression_regexp)
|
12
14
|
end
|
13
15
|
|
14
16
|
def match(text)
|
@@ -26,7 +28,7 @@ module Cucumber
|
|
26
28
|
parameter_type = @parameter_type_registry.lookup_by_regexp(parameter_type_regexp, @expression_regexp, text)
|
27
29
|
if parameter_type.nil?
|
28
30
|
parameter_type = ParameterType.new(
|
29
|
-
|
31
|
+
parameter_type_regexp,
|
30
32
|
parameter_type_regexp,
|
31
33
|
String,
|
32
34
|
lambda {|s| s},
|
@@ -38,12 +40,20 @@ module Cucumber
|
|
38
40
|
parameter_types.push(parameter_type)
|
39
41
|
end
|
40
42
|
|
41
|
-
Argument.build(@
|
43
|
+
Argument.build(@tree_regexp, text, parameter_types)
|
42
44
|
end
|
43
45
|
|
44
|
-
def
|
46
|
+
def regexp
|
45
47
|
@expression_regexp
|
46
48
|
end
|
49
|
+
|
50
|
+
def source
|
51
|
+
@expression_regexp.source
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
regexp.inspect
|
56
|
+
end
|
47
57
|
end
|
48
58
|
end
|
49
59
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/group_builder'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module CucumberExpressions
|
5
|
+
class TreeRegexp
|
6
|
+
attr_reader :regexp
|
7
|
+
|
8
|
+
def initialize(regexp)
|
9
|
+
@regexp = regexp.is_a?(Regexp) ? regexp : Regexp.new(regexp)
|
10
|
+
|
11
|
+
stack = [GroupBuilder.new]
|
12
|
+
last = nil
|
13
|
+
non_capturing_maybe = false
|
14
|
+
@regexp.source.split('').each do |c|
|
15
|
+
if c == '(' && last != '\\'
|
16
|
+
stack.push(GroupBuilder.new)
|
17
|
+
non_capturing_maybe = false
|
18
|
+
elsif c == ')' && last != '\\'
|
19
|
+
gb = stack.pop
|
20
|
+
if gb.capturing?
|
21
|
+
stack.last.add(gb)
|
22
|
+
else
|
23
|
+
gb.move_children_to(stack.last)
|
24
|
+
end
|
25
|
+
non_capturing_maybe = false
|
26
|
+
elsif c == '?' && last == '('
|
27
|
+
non_capturing_maybe = true
|
28
|
+
elsif c == ':' && non_capturing_maybe
|
29
|
+
stack.last.set_non_capturing!
|
30
|
+
non_capturing_maybe = false
|
31
|
+
end
|
32
|
+
last = c
|
33
|
+
end
|
34
|
+
@group_builder = stack.pop
|
35
|
+
end
|
36
|
+
|
37
|
+
def match(s)
|
38
|
+
match = @regexp.match(s)
|
39
|
+
return nil if match.nil?
|
40
|
+
group_indices = (0..match.length).to_a.to_enum
|
41
|
+
@group_builder.build(match, group_indices)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -7,7 +7,7 @@ module Cucumber
|
|
7
7
|
context "Regexp translation" do
|
8
8
|
def assert_regexp(expression, regexp)
|
9
9
|
cucumber_expression = CucumberExpression.new(expression, ParameterTypeRegistry.new)
|
10
|
-
expect(regexp).to eq(cucumber_expression.
|
10
|
+
expect(regexp).to eq(cucumber_expression.regexp)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "translates no arguments" do
|
@@ -27,7 +27,7 @@ module Cucumber
|
|
27
27
|
it "translates parameters" do
|
28
28
|
assert_regexp(
|
29
29
|
"I have {float} cukes at {int} o'clock",
|
30
|
-
/^I have (-?\d
|
30
|
+
/^I have (-?\d*\.\d+) cukes at ((?:-?\d+)|(?:\d+)) o'clock$/
|
31
31
|
)
|
32
32
|
end
|
33
33
|
|
@@ -28,7 +28,7 @@ module Cucumber
|
|
28
28
|
@registry.define_parameter_type(ParameterType.new("place", CAPITALISED_WORD, Place, lambda {|s| Place.new}, true, true))
|
29
29
|
end.to raise_error(
|
30
30
|
CucumberExpressionError,
|
31
|
-
"There can only be one
|
31
|
+
"There can only be one preferential parameter type per regexp. The regexp /[A-Z]+\\w+/ is used for two preferential parameter types, {name} and {place}"
|
32
32
|
)
|
33
33
|
end
|
34
34
|
|
@@ -76,7 +76,7 @@ module Cucumber
|
|
76
76
|
" {place} and {person}\n" +
|
77
77
|
" {place} and {place}\n" +
|
78
78
|
"\n" +
|
79
|
-
"2) Make one of the parameter types
|
79
|
+
"2) Make one of the parameter types preferential and continue to use a Regular Expression.\n" +
|
80
80
|
"\n"
|
81
81
|
)
|
82
82
|
end
|
@@ -29,11 +29,11 @@ module Cucumber
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it "transforms float without integer part" do
|
32
|
-
expect( match(/(-?\d
|
32
|
+
expect( match(/(-?\d*\.\d+)/, ".22") ).to eq([0.22])
|
33
33
|
end
|
34
34
|
|
35
35
|
it "transforms float with sign" do
|
36
|
-
expect( match(/(-?\d
|
36
|
+
expect( match(/(-?\d*\.\d+)/, "-1.22") ).to eq([-1.22])
|
37
37
|
end
|
38
38
|
|
39
39
|
it "returns nil when there is no match" do
|
@@ -42,14 +42,16 @@ module Cucumber
|
|
42
42
|
|
43
43
|
it "ignores non capturing groups" do
|
44
44
|
expect( match(
|
45
|
-
/(\S+) ?(can|cannot)
|
45
|
+
/(\S+) ?(can|cannot) (?:delete|cancel) the (\d+)(?:st|nd|rd|th) (attachment|slide) ?(?:upload)?/,
|
46
46
|
"I can cancel the 1st slide upload")
|
47
47
|
).to eq(["I", "can", 1, "slide"])
|
48
48
|
end
|
49
49
|
|
50
|
-
it "exposes source" do
|
51
|
-
|
52
|
-
|
50
|
+
it "exposes source and regexp" do
|
51
|
+
regexp = /I have (\d+) cukes? in my (\+) now/
|
52
|
+
expression = RegularExpression.new(regexp, ParameterTypeRegistry.new)
|
53
|
+
expect(expression.regexp).to eq(regexp)
|
54
|
+
expect(expression.source).to eq(regexp.source)
|
53
55
|
end
|
54
56
|
|
55
57
|
def match(expression, text)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'cucumber/cucumber_expressions/tree_regexp'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module CucumberExpressions
|
5
|
+
describe TreeRegexp do
|
6
|
+
it 'builds tree' do
|
7
|
+
tr = TreeRegexp.new(/(a(?:b)?)(c)/)
|
8
|
+
group = tr.match('ac')
|
9
|
+
expect(group.value).to eq('ac')
|
10
|
+
expect(group.children[0].value).to eq('a')
|
11
|
+
expect(group.children[0].children).to eq([])
|
12
|
+
expect(group.children[1].value).to eq('c')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'ignores non-capturing groups' do
|
16
|
+
tr = TreeRegexp.new(/(a(?:b)?)(c)/)
|
17
|
+
group = tr.match('ac')
|
18
|
+
expect(group.value).to eq('ac')
|
19
|
+
expect(group.children[0].value).to eq('a')
|
20
|
+
expect(group.children[0].children).to eq([])
|
21
|
+
expect(group.children[1].value).to eq('c')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'matches optional group' do
|
25
|
+
tr = TreeRegexp.new(/^Something( with an optional argument)?/)
|
26
|
+
group = tr.match('Something')
|
27
|
+
expect(group.children[0].value).to eq(nil)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'matches nested groups' do
|
31
|
+
tr = TreeRegexp.new(/^A (\d+) thick line from ((\d+),\s*(\d+),\s*(\d+)) to ((\d+),\s*(\d+),\s*(\d+))/)
|
32
|
+
group = tr.match('A 5 thick line from 10,20,30 to 40,50,60')
|
33
|
+
|
34
|
+
expect(group.children[0].value).to eq('5')
|
35
|
+
expect(group.children[1].value).to eq('10,20,30')
|
36
|
+
expect(group.children[1].children[0].value).to eq('10')
|
37
|
+
expect(group.children[1].children[1].value).to eq('20')
|
38
|
+
expect(group.children[1].children[2].value).to eq('30')
|
39
|
+
expect(group.children[2].value).to eq('40,50,60')
|
40
|
+
expect(group.children[2].children[0].value).to eq('40')
|
41
|
+
expect(group.children[2].children[1].value).to eq('50')
|
42
|
+
expect(group.children[2].children[2].value).to eq('60')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'detects multiple non capturing groups' do
|
46
|
+
tr = TreeRegexp.new(/(?:a)(:b)(\?c)(d)/)
|
47
|
+
group = tr.match("a:b?cd")
|
48
|
+
expect(group.children.length).to eq(3)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'captures non capturing groups with capturing groups inside' do
|
52
|
+
tr = TreeRegexp.new("the stdout(?: from \"(.*?)\")?")
|
53
|
+
group = tr.match("the stdout")
|
54
|
+
expect(group.value).to eq("the stdout")
|
55
|
+
expect(group.children[0].value).to eq(nil)
|
56
|
+
expect(group.children.length).to eq(1)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-expressions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,10 +89,12 @@ files:
|
|
89
89
|
- lib/cucumber/cucumber_expressions/errors.rb
|
90
90
|
- lib/cucumber/cucumber_expressions/generated_expression.rb
|
91
91
|
- lib/cucumber/cucumber_expressions/group.rb
|
92
|
+
- lib/cucumber/cucumber_expressions/group_builder.rb
|
92
93
|
- lib/cucumber/cucumber_expressions/parameter_type.rb
|
93
94
|
- lib/cucumber/cucumber_expressions/parameter_type_matcher.rb
|
94
95
|
- lib/cucumber/cucumber_expressions/parameter_type_registry.rb
|
95
96
|
- lib/cucumber/cucumber_expressions/regular_expression.rb
|
97
|
+
- lib/cucumber/cucumber_expressions/tree_regexp.rb
|
96
98
|
- spec/capture_warnings.rb
|
97
99
|
- spec/coverage.rb
|
98
100
|
- spec/cucumber/cucumber_expressions/combinatorial_generated_expression_factory_test.rb
|
@@ -101,9 +103,9 @@ files:
|
|
101
103
|
- spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb
|
102
104
|
- spec/cucumber/cucumber_expressions/custom_parameter_type_spec.rb
|
103
105
|
- spec/cucumber/cucumber_expressions/expression_examples_spec.rb
|
104
|
-
- spec/cucumber/cucumber_expressions/group_spec.rb
|
105
106
|
- spec/cucumber/cucumber_expressions/parameter_type_registry_spec.rb
|
106
107
|
- spec/cucumber/cucumber_expressions/regular_expression_spec.rb
|
108
|
+
- spec/cucumber/cucumber_expressions/tree_regexp_spec.rb
|
107
109
|
homepage: https://github.com/cucumber/cucumber-expressions-ruby#readme
|
108
110
|
licenses:
|
109
111
|
- MIT
|
@@ -128,7 +130,7 @@ rubyforge_project:
|
|
128
130
|
rubygems_version: 2.6.8
|
129
131
|
signing_key:
|
130
132
|
specification_version: 4
|
131
|
-
summary: cucumber-expressions-4.0.
|
133
|
+
summary: cucumber-expressions-4.0.1
|
132
134
|
test_files:
|
133
135
|
- spec/capture_warnings.rb
|
134
136
|
- spec/coverage.rb
|
@@ -138,6 +140,6 @@ test_files:
|
|
138
140
|
- spec/cucumber/cucumber_expressions/cucumber_expression_spec.rb
|
139
141
|
- spec/cucumber/cucumber_expressions/custom_parameter_type_spec.rb
|
140
142
|
- spec/cucumber/cucumber_expressions/expression_examples_spec.rb
|
141
|
-
- spec/cucumber/cucumber_expressions/group_spec.rb
|
142
143
|
- spec/cucumber/cucumber_expressions/parameter_type_registry_spec.rb
|
143
144
|
- spec/cucumber/cucumber_expressions/regular_expression_spec.rb
|
145
|
+
- spec/cucumber/cucumber_expressions/tree_regexp_spec.rb
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'cucumber/cucumber_expressions/group'
|
2
|
-
|
3
|
-
module Cucumber
|
4
|
-
module CucumberExpressions
|
5
|
-
describe Group do
|
6
|
-
it 'matches optional group' do
|
7
|
-
regexp = /^Something( with an optional argument)?/
|
8
|
-
string = 'Something'
|
9
|
-
matches = regexp.match(string)
|
10
|
-
group = Group.new(matches, string)
|
11
|
-
|
12
|
-
expect(group.children[0].value).to eq(nil)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'matches nested groups' do
|
16
|
-
regexp = /^A (\d+) thick line from ((\d+),\s*(\d+),\s*(\d+)) to ((\d+),\s*(\d+),\s*(\d+))?/
|
17
|
-
string = 'A 5 thick line from 10,20,30 to 40,50,60'
|
18
|
-
|
19
|
-
matches = regexp.match(string)
|
20
|
-
group = Group.new(matches, string)
|
21
|
-
|
22
|
-
expect(group.children[0].value).to eq('5')
|
23
|
-
expect(group.children[1].value).to eq('10,20,30')
|
24
|
-
expect(group.children[1].children[0].value).to eq('10')
|
25
|
-
expect(group.children[1].children[1].value).to eq('20')
|
26
|
-
expect(group.children[1].children[2].value).to eq('30')
|
27
|
-
expect(group.children[2].value).to eq('40,50,60')
|
28
|
-
expect(group.children[2].children[0].value).to eq('40')
|
29
|
-
expect(group.children[2].children[1].value).to eq('50')
|
30
|
-
expect(group.children[2].children[2].value).to eq('60')
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|