gherkin3 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/bin/gherkin-generate-ast +1 -4
- data/bin/gherkin-generate-tokens +2 -4
- data/gherkin-ruby.razor +15 -11
- data/gherkin3.gemspec +1 -1
- data/lib/gherkin3/ast_builder.rb +4 -0
- data/lib/gherkin3/parser.rb +15 -11
- data/lib/gherkin3/token_formatter_builder.rb +4 -0
- data/lib/gherkin3/token_matcher.rb +5 -0
- data/spec/gherkin3/parser_spec.rb +75 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b5220c8f72cd396ab0a8ec44e0c4ec82e7e0cdf
|
4
|
+
data.tar.gz: c0229d0cf820b457b5e7a09aa309c86db07ecdfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46ce5c3083f84024343c7648c32504e2470a46830839700ba9ca2fbbb1805c2f527dc6ce18786d63adf660e2a84867f895c3b15e02be0712a7a4fa74e2d48621
|
7
|
+
data.tar.gz: e3b7e5f8ba2717fe48ab65cb2fd74e581c27dc94b71c4a6bd58090878a2aca1da42eedae0e1aed69cc0873ede6a361ba57ac5bd745f5d3071804b0f5bec8ab69
|
data/.travis.yml
CHANGED
data/bin/gherkin-generate-ast
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"../lib"))
|
3
3
|
require 'gherkin3/parser'
|
4
4
|
require 'gherkin3/token_scanner'
|
5
|
-
require 'gherkin3/token_matcher'
|
6
|
-
require 'gherkin3/ast_builder'
|
7
5
|
require 'json'
|
8
6
|
|
9
7
|
parser = Gherkin3::Parser.new
|
@@ -12,9 +10,8 @@ files = ARGV.any? ? ARGV : (STDIN.tty? ? [] : [STDIN])
|
|
12
10
|
start_time = Time.now
|
13
11
|
files.each do |file|
|
14
12
|
scanner = Gherkin3::TokenScanner.new(file)
|
15
|
-
builder = Gherkin3::AstBuilder.new
|
16
13
|
begin
|
17
|
-
puts JSON.generate(parser.parse(scanner
|
14
|
+
puts JSON.generate(parser.parse(scanner))
|
18
15
|
rescue Gherkin3::ParserError => e
|
19
16
|
STDERR.puts e.message
|
20
17
|
exit 1
|
data/bin/gherkin-generate-tokens
CHANGED
@@ -3,12 +3,10 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"../lib"))
|
|
3
3
|
require 'gherkin3/parser'
|
4
4
|
require 'gherkin3/token_scanner'
|
5
5
|
require 'gherkin3/token_formatter_builder'
|
6
|
-
require 'gherkin3/token_matcher'
|
7
6
|
|
8
|
-
parser = Gherkin3::Parser.new
|
7
|
+
parser = Gherkin3::Parser.new(Gherkin3::TokenFormatterBuilder.new)
|
9
8
|
files = ARGV + (STDIN.tty? ? [] : [STDIN])
|
10
9
|
files.each do |file|
|
11
10
|
scanner = Gherkin3::TokenScanner.new(file)
|
12
|
-
|
13
|
-
print parser.parse(scanner, builder, Gherkin3::TokenMatcher.new)
|
11
|
+
print parser.parse(scanner)
|
14
12
|
end
|
data/gherkin-ruby.razor
CHANGED
@@ -40,11 +40,10 @@ module Gherkin3
|
|
40
40
|
]
|
41
41
|
|
42
42
|
class ParserContext
|
43
|
-
attr_reader :token_scanner, :
|
43
|
+
attr_reader :token_scanner, :token_matcher, :token_queue, :errors
|
44
44
|
|
45
|
-
def initialize(token_scanner,
|
45
|
+
def initialize(token_scanner, token_matcher, token_queue, errors)
|
46
46
|
@@token_scanner = token_scanner
|
47
|
-
@@ast_builder = ast_builder
|
48
47
|
@@token_matcher = token_matcher
|
49
48
|
@@token_queue = token_queue
|
50
49
|
@@errors = errors
|
@@ -54,10 +53,15 @@ module Gherkin3
|
|
54
53
|
class @Model.ParserClassName
|
55
54
|
attr_accessor :stop_at_first_error
|
56
55
|
|
57
|
-
def
|
56
|
+
def initialize(ast_builder=AstBuilder.new)
|
57
|
+
@@ast_builder = ast_builder
|
58
|
+
end
|
59
|
+
|
60
|
+
def parse(token_scanner, token_matcher=TokenMatcher.new)
|
61
|
+
@@ast_builder.reset
|
62
|
+
token_matcher.reset
|
58
63
|
context = ParserContext.new(
|
59
64
|
token_scanner,
|
60
|
-
ast_builder,
|
61
65
|
token_matcher,
|
62
66
|
[],
|
63
67
|
[]
|
@@ -75,12 +79,12 @@ module Gherkin3
|
|
75
79
|
|
76
80
|
raise CompositeParserException.new(context.errors) if context.errors.any?
|
77
81
|
|
78
|
-
get_result(
|
82
|
+
get_result()
|
79
83
|
end
|
80
84
|
|
81
85
|
def build(context, token)
|
82
86
|
handle_ast_error(context) do
|
83
|
-
|
87
|
+
@@ast_builder.build(token)
|
84
88
|
end
|
85
89
|
end
|
86
90
|
|
@@ -91,18 +95,18 @@ module Gherkin3
|
|
91
95
|
|
92
96
|
def start_rule(context, rule_type)
|
93
97
|
handle_ast_error(context) do
|
94
|
-
|
98
|
+
@@ast_builder.start_rule(rule_type)
|
95
99
|
end
|
96
100
|
end
|
97
101
|
|
98
102
|
def end_rule(context, rule_type)
|
99
103
|
handle_ast_error(context) do
|
100
|
-
|
104
|
+
@@ast_builder.end_rule(rule_type)
|
101
105
|
end
|
102
106
|
end
|
103
107
|
|
104
|
-
def get_result(
|
105
|
-
|
108
|
+
def get_result()
|
109
|
+
@@ast_builder.get_result
|
106
110
|
end
|
107
111
|
|
108
112
|
def read_token(context)
|
data/gherkin3.gemspec
CHANGED
data/lib/gherkin3/ast_builder.rb
CHANGED
data/lib/gherkin3/parser.rb
CHANGED
@@ -46,11 +46,10 @@ module Gherkin3
|
|
46
46
|
]
|
47
47
|
|
48
48
|
class ParserContext
|
49
|
-
attr_reader :token_scanner, :
|
49
|
+
attr_reader :token_scanner, :token_matcher, :token_queue, :errors
|
50
50
|
|
51
|
-
def initialize(token_scanner,
|
51
|
+
def initialize(token_scanner, token_matcher, token_queue, errors)
|
52
52
|
@token_scanner = token_scanner
|
53
|
-
@ast_builder = ast_builder
|
54
53
|
@token_matcher = token_matcher
|
55
54
|
@token_queue = token_queue
|
56
55
|
@errors = errors
|
@@ -60,10 +59,15 @@ module Gherkin3
|
|
60
59
|
class Parser
|
61
60
|
attr_accessor :stop_at_first_error
|
62
61
|
|
63
|
-
def
|
62
|
+
def initialize(ast_builder=AstBuilder.new)
|
63
|
+
@ast_builder = ast_builder
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse(token_scanner, token_matcher=TokenMatcher.new)
|
67
|
+
@ast_builder.reset
|
68
|
+
token_matcher.reset
|
64
69
|
context = ParserContext.new(
|
65
70
|
token_scanner,
|
66
|
-
ast_builder,
|
67
71
|
token_matcher,
|
68
72
|
[],
|
69
73
|
[]
|
@@ -81,12 +85,12 @@ module Gherkin3
|
|
81
85
|
|
82
86
|
raise CompositeParserException.new(context.errors) if context.errors.any?
|
83
87
|
|
84
|
-
get_result(
|
88
|
+
get_result()
|
85
89
|
end
|
86
90
|
|
87
91
|
def build(context, token)
|
88
92
|
handle_ast_error(context) do
|
89
|
-
|
93
|
+
@ast_builder.build(token)
|
90
94
|
end
|
91
95
|
end
|
92
96
|
|
@@ -97,18 +101,18 @@ module Gherkin3
|
|
97
101
|
|
98
102
|
def start_rule(context, rule_type)
|
99
103
|
handle_ast_error(context) do
|
100
|
-
|
104
|
+
@ast_builder.start_rule(rule_type)
|
101
105
|
end
|
102
106
|
end
|
103
107
|
|
104
108
|
def end_rule(context, rule_type)
|
105
109
|
handle_ast_error(context) do
|
106
|
-
|
110
|
+
@ast_builder.end_rule(rule_type)
|
107
111
|
end
|
108
112
|
end
|
109
113
|
|
110
|
-
def get_result(
|
111
|
-
|
114
|
+
def get_result()
|
115
|
+
@ast_builder.get_result
|
112
116
|
end
|
113
117
|
|
114
118
|
def read_token(context)
|
@@ -2,6 +2,7 @@ require 'gherkin3/parser'
|
|
2
2
|
require 'gherkin3/token_scanner'
|
3
3
|
require 'gherkin3/token_matcher'
|
4
4
|
require 'gherkin3/ast_builder'
|
5
|
+
require 'gherkin3/errors'
|
5
6
|
require 'rspec'
|
6
7
|
|
7
8
|
module Gherkin3
|
@@ -9,8 +10,7 @@ module Gherkin3
|
|
9
10
|
it "parses a simple feature" do
|
10
11
|
parser = Parser.new
|
11
12
|
scanner = TokenScanner.new("Feature: test")
|
12
|
-
|
13
|
-
ast = parser.parse(scanner, builder, TokenMatcher.new)
|
13
|
+
ast = parser.parse(scanner)
|
14
14
|
expect(ast).to eq({
|
15
15
|
type: :Feature,
|
16
16
|
tags: [],
|
@@ -22,5 +22,78 @@ module Gherkin3
|
|
22
22
|
comments: []
|
23
23
|
})
|
24
24
|
end
|
25
|
+
|
26
|
+
it "can parse multiple features" do
|
27
|
+
parser = Parser.new
|
28
|
+
ast1 = parser.parse(TokenScanner.new("Feature: test"))
|
29
|
+
ast2 = parser.parse(TokenScanner.new("Feature: test2"))
|
30
|
+
|
31
|
+
expect(ast1).to eq({
|
32
|
+
type: :Feature,
|
33
|
+
tags: [],
|
34
|
+
location: {line: 1, column: 1},
|
35
|
+
language: "en",
|
36
|
+
keyword: "Feature",
|
37
|
+
name: "test",
|
38
|
+
scenarioDefinitions: [],
|
39
|
+
comments: []
|
40
|
+
})
|
41
|
+
expect(ast2).to eq({
|
42
|
+
type: :Feature,
|
43
|
+
tags: [],
|
44
|
+
location: {line: 1, column: 1},
|
45
|
+
language: "en",
|
46
|
+
keyword: "Feature",
|
47
|
+
name: "test2",
|
48
|
+
scenarioDefinitions: [],
|
49
|
+
comments: []
|
50
|
+
})
|
51
|
+
end
|
52
|
+
|
53
|
+
it "can parse feature after parse error" do
|
54
|
+
parser = Parser.new
|
55
|
+
matcher = TokenMatcher.new
|
56
|
+
|
57
|
+
expect { parser.parse(TokenScanner.new("# a comment\n" +
|
58
|
+
"Feature: Foo\n" +
|
59
|
+
" Scenario: Bar\n" +
|
60
|
+
" Given x\n" +
|
61
|
+
" ```\n" +
|
62
|
+
" unclosed docstring\n"),
|
63
|
+
matcher)
|
64
|
+
}.to raise_error(ParserError)
|
65
|
+
ast = parser.parse(TokenScanner.new("Feature: Foo\n" +
|
66
|
+
" Scenario: Bar\n" +
|
67
|
+
" Given x\n" +
|
68
|
+
' """' + "\n" +
|
69
|
+
" closed docstring\n" +
|
70
|
+
' """' + "\n"),
|
71
|
+
matcher)
|
72
|
+
|
73
|
+
expect(ast).to eq({
|
74
|
+
type: :Feature,
|
75
|
+
tags: [],
|
76
|
+
location: {line: 1, column: 1},
|
77
|
+
language: "en",
|
78
|
+
keyword: "Feature",
|
79
|
+
name: "Foo",
|
80
|
+
scenarioDefinitions: [{
|
81
|
+
:type=>:Scenario,
|
82
|
+
:tags=>[],
|
83
|
+
:location=>{:line=>2, :column=>3},
|
84
|
+
:keyword=>"Scenario",
|
85
|
+
:name=>"Bar",
|
86
|
+
:steps=>[{
|
87
|
+
:type=>:Step,
|
88
|
+
:location=>{:line=>3, :column=>5},
|
89
|
+
:keyword=>"Given ",
|
90
|
+
:text=>"x",
|
91
|
+
:argument=>{:type=>:DocString,
|
92
|
+
:location=>{:line=>4, :column=>7},
|
93
|
+
:contentType=>"",
|
94
|
+
:content=>"closed docstring"}}]}],
|
95
|
+
comments: []
|
96
|
+
})
|
97
|
+
end
|
25
98
|
end
|
26
99
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gherkin3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gáspár Nagy
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-08-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -123,7 +123,7 @@ rubyforge_project:
|
|
123
123
|
rubygems_version: 2.4.5
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
|
-
summary: gherkin-3.
|
126
|
+
summary: gherkin-3.1.0
|
127
127
|
test_files:
|
128
128
|
- spec/capture_warnings.rb
|
129
129
|
- spec/coverage.rb
|