gherkin 1.0.3-java → 1.0.4-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +15 -6
- data/README.rdoc +23 -0
- data/Rakefile +1 -0
- data/VERSION.yml +1 -1
- data/features/step_definitions/gherkin_steps.rb +1 -1
- data/features/step_definitions/{pretty_printer_steps.rb → pretty_listener_step.rb} +2 -2
- data/gherkin.gemspec +24 -35
- data/java/Gherkin.iml +8 -14
- data/java/src/{gherkin → main/java/gherkin}/lexer/.gitignore +0 -0
- data/lib/gherkin.rb +1 -1
- data/lib/gherkin/c_lexer.rb +2 -2
- data/lib/gherkin/{format → formatter}/argument.rb +1 -1
- data/lib/gherkin/{tools → formatter}/colors.rb +1 -1
- data/lib/gherkin/{format → formatter}/monochrome_format.rb +1 -1
- data/lib/gherkin/{tools → formatter}/pretty_listener.rb +8 -9
- data/lib/gherkin/i18n.rb +27 -5
- data/lib/gherkin/i18n_lexer.rb +18 -44
- data/lib/gherkin/parser/filter_listener.rb +191 -0
- data/lib/gherkin/parser/parser.rb +142 -0
- data/lib/gherkin/parser/sexp.rb +45 -0
- data/lib/gherkin/parser/tag_expression.rb +46 -0
- data/lib/gherkin/rb_lexer.rb +2 -2
- data/ragel/lexer_common.rl.erb +1 -1
- data/spec/gherkin/{format → formatter}/argument_spec.rb +2 -2
- data/spec/gherkin/{tools → formatter}/colors_spec.rb +2 -2
- data/spec/gherkin/{tools → formatter}/pretty_listener_spec.rb +5 -5
- data/spec/gherkin/i18n_lexer_spec.rb +3 -3
- data/spec/gherkin/parser/filter_listener_spec.rb +363 -0
- data/spec/gherkin/parser/parser_spec.rb +35 -0
- data/spec/gherkin/parser/tag_expression_spec.rb +120 -0
- data/spec/gherkin/rb_lexer_spec.rb +0 -1
- data/spec/gherkin/sexp_recorder.rb +3 -3
- data/spec/gherkin/shared/lexer_spec.rb +19 -19
- data/spec/gherkin/shared/tags_spec.rb +4 -4
- data/tasks/bench.rake +2 -2
- data/tasks/compile.rake +1 -1
- data/tasks/ragel_task.rb +1 -1
- metadata +25 -36
- data/java/build.xml +0 -16
- data/java/src/gherkin/FixJava.java +0 -37
- data/java/src/gherkin/I18nLexer.java +0 -48
- data/java/src/gherkin/Lexer.java +0 -5
- data/java/src/gherkin/LexingError.java +0 -7
- data/java/src/gherkin/Listener.java +0 -29
- data/java/src/gherkin/Main.java +0 -17
- data/java/src/gherkin/ParseError.java +0 -22
- data/java/src/gherkin/Parser.java +0 -191
- data/java/src/gherkin/formatter/Argument.java +0 -39
- data/java/src/gherkin/formatter/ArgumentFormat.java +0 -17
- data/java/src/gherkin/formatter/Colors.java +0 -7
- data/java/src/gherkin/formatter/Formatter.java +0 -15
- data/java/src/gherkin/formatter/PrettyFormatter.java +0 -219
- data/java/src/gherkin/parser/StateMachineReader.java +0 -67
- data/java/test/gherkin/formatter/ArgumentTest.java +0 -17
- data/lib/gherkin/lexer.rb +0 -35
- data/lib/gherkin/parser.rb +0 -19
- data/lib/gherkin/rb_parser.rb +0 -125
- data/spec/gherkin/parser_spec.rb +0 -33
@@ -1,67 +0,0 @@
|
|
1
|
-
package gherkin.parser;
|
2
|
-
|
3
|
-
import gherkin.FixJava;
|
4
|
-
import gherkin.Lexer;
|
5
|
-
import gherkin.Listener;
|
6
|
-
import gherkin.lexer.En;
|
7
|
-
|
8
|
-
import java.io.IOException;
|
9
|
-
import java.util.List;
|
10
|
-
import java.util.ArrayList;
|
11
|
-
|
12
|
-
public class StateMachineReader implements Listener {
|
13
|
-
private final String machinePath;
|
14
|
-
private List<List<String>> transitionTable;
|
15
|
-
|
16
|
-
public StateMachineReader(String name) {
|
17
|
-
machinePath = "/gherkin/parser/" + name + ".txt";
|
18
|
-
}
|
19
|
-
|
20
|
-
public List<List<String>> transitionTable() {
|
21
|
-
transitionTable = new ArrayList<List<String>>();
|
22
|
-
Lexer lexer = new En(this);
|
23
|
-
try {
|
24
|
-
lexer.scan(FixJava.readResource(machinePath));
|
25
|
-
} catch (IOException e) {
|
26
|
-
throw new RuntimeException("Fatal error. Couldn't read " + machinePath);
|
27
|
-
}
|
28
|
-
return transitionTable;
|
29
|
-
}
|
30
|
-
|
31
|
-
public void tag(String name, int line) {
|
32
|
-
}
|
33
|
-
|
34
|
-
public void comment(String content, int line) {
|
35
|
-
}
|
36
|
-
|
37
|
-
public void feature(String keyword, String name, int line) {
|
38
|
-
}
|
39
|
-
|
40
|
-
public void background(String keyword, String name, int line) {
|
41
|
-
}
|
42
|
-
|
43
|
-
public void scenario(String keyword, String name, int line) {
|
44
|
-
}
|
45
|
-
|
46
|
-
public void scenario_outline(String keyword, String name, int line) {
|
47
|
-
}
|
48
|
-
|
49
|
-
public void examples(String keyword, String name, int line) {
|
50
|
-
}
|
51
|
-
|
52
|
-
public void step(String keyword, String name, int line) {
|
53
|
-
}
|
54
|
-
|
55
|
-
public void py_string(String string, int line) {
|
56
|
-
}
|
57
|
-
|
58
|
-
public void eof() {
|
59
|
-
}
|
60
|
-
|
61
|
-
public void syntax_error(String name, String event, List<String> strings, int line) {
|
62
|
-
}
|
63
|
-
|
64
|
-
public void row(List<String> row, int line) {
|
65
|
-
transitionTable.add(row);
|
66
|
-
}
|
67
|
-
}
|
@@ -1,17 +0,0 @@
|
|
1
|
-
package gherkin.formatter;
|
2
|
-
|
3
|
-
import org.junit.Test;
|
4
|
-
|
5
|
-
import java.io.UnsupportedEncodingException;
|
6
|
-
|
7
|
-
import static org.junit.Assert.assertEquals;
|
8
|
-
|
9
|
-
public class ArgumentTest {
|
10
|
-
@Test
|
11
|
-
public void shouldFormatAscii() throws UnsupportedEncodingException {
|
12
|
-
assertEquals("I have [[[[åtte] cukes i [[[[bøtta]", Argument.format("I have åtte cukes i bøtta", new ArgumentFormat("[[[[", "]"),
|
13
|
-
new Argument(7, "åtte"),
|
14
|
-
new Argument(21, "bøtta")
|
15
|
-
));
|
16
|
-
}
|
17
|
-
}
|
data/lib/gherkin/lexer.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Gherkin
|
2
|
-
module Lexer
|
3
|
-
|
4
|
-
class << self
|
5
|
-
def [](i18n_lang)
|
6
|
-
begin
|
7
|
-
begin
|
8
|
-
c[i18n_lang]
|
9
|
-
rescue NameError, LoadError => e
|
10
|
-
raise("WARNING: #{e.message}. Reverting to Ruby lexer.") unless defined?(@warned)
|
11
|
-
@warned = true
|
12
|
-
rb[i18n_lang]
|
13
|
-
end
|
14
|
-
rescue LoadError => e
|
15
|
-
raise I18nLexerNotFound, "No lexer was found for #{i18n_lang} (#{e.message}). Supported languages are listed in gherkin/i18n.yml."
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def c
|
20
|
-
require 'gherkin/c_lexer'
|
21
|
-
CLexer
|
22
|
-
end
|
23
|
-
|
24
|
-
def csharp
|
25
|
-
require 'gherkin/csharp_lexer'
|
26
|
-
CSharpLexer
|
27
|
-
end
|
28
|
-
|
29
|
-
def rb
|
30
|
-
require 'gherkin/rb_lexer'
|
31
|
-
RbLexer
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/gherkin/parser.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Gherkin
|
2
|
-
class ParseError < StandardError
|
3
|
-
def initialize(state, new_state, expected_states, line)
|
4
|
-
super("Parse error on line #{line}. Found #{new_state} when expecting one of: #{expected_states.join(', ')}. (Current state: #{state}).")
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
class Parser
|
9
|
-
def self.new(listener, raise_on_error=false, machine_name='root')
|
10
|
-
if defined?(JRUBY_VERSION)
|
11
|
-
require 'gherkin.jar'
|
12
|
-
Java::Gherkin::Parser.new(listener, raise_on_error, machine_name)
|
13
|
-
else
|
14
|
-
require 'gherkin/rb_parser'
|
15
|
-
Gherkin::RbParser.new(listener, raise_on_error, machine_name)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/gherkin/rb_parser.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
module Gherkin
|
2
|
-
class RbParser
|
3
|
-
# Initialize the parser. +machine_name+ refers to a state machine table.
|
4
|
-
def initialize(listener, raise_on_error, machine_name)
|
5
|
-
@listener = listener
|
6
|
-
@raise_on_error = raise_on_error
|
7
|
-
@machines = []
|
8
|
-
push_machine(machine_name)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Doesn't yet fall back to super
|
12
|
-
def method_missing(method, *args)
|
13
|
-
# TODO: Catch exception and call super
|
14
|
-
if(event(method.to_s, args[-1]))
|
15
|
-
@listener.send(method, *args)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def event(ev, line)
|
20
|
-
machine.event(ev, line) do |state, expected|
|
21
|
-
if @raise_on_error
|
22
|
-
raise ParseError.new(state, ev, expected, line)
|
23
|
-
else
|
24
|
-
@listener.syntax_error(state, ev, expected, line)
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
end
|
28
|
-
true
|
29
|
-
end
|
30
|
-
|
31
|
-
def push_machine(name)
|
32
|
-
@machines.push(Machine.new(self, name))
|
33
|
-
end
|
34
|
-
|
35
|
-
def pop_machine
|
36
|
-
@machines.pop
|
37
|
-
end
|
38
|
-
|
39
|
-
def machine
|
40
|
-
@machines[-1]
|
41
|
-
end
|
42
|
-
|
43
|
-
def expected
|
44
|
-
machine.expected
|
45
|
-
end
|
46
|
-
|
47
|
-
def force_state(state)
|
48
|
-
machine.instance_variable_set('@state', state)
|
49
|
-
end
|
50
|
-
|
51
|
-
class Machine
|
52
|
-
def initialize(parser, name)
|
53
|
-
@parser = parser
|
54
|
-
@name = name
|
55
|
-
@transition_map = transition_map(name)
|
56
|
-
@state = name
|
57
|
-
end
|
58
|
-
|
59
|
-
def event(ev, line)
|
60
|
-
states = @transition_map[@state]
|
61
|
-
raise "Unknown state: #{@state.inspect} for machine #{@name}" if states.nil?
|
62
|
-
new_state = states[ev]
|
63
|
-
case new_state
|
64
|
-
when "E"
|
65
|
-
yield @state, expected
|
66
|
-
when /push\((.+)\)/
|
67
|
-
@parser.push_machine($1)
|
68
|
-
@parser.event(ev, line)
|
69
|
-
when "pop()"
|
70
|
-
@parser.pop_machine()
|
71
|
-
@parser.event(ev, line)
|
72
|
-
else
|
73
|
-
raise "Unknown transition: #{ev.inspect} among #{states.inspect} for machine #{@name}" if new_state.nil?
|
74
|
-
@state = new_state
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def expected
|
79
|
-
allowed = @transition_map[@state].find_all { |_, action| action != "E" }
|
80
|
-
allowed.collect { |state| state[0] }.sort - ['eof']
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
@@transition_maps = {}
|
86
|
-
|
87
|
-
def transition_map(name)
|
88
|
-
@@transition_maps[name] ||= build_transition_map(name)
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_transition_map(name)
|
92
|
-
table = transition_table(name)
|
93
|
-
events = table.shift[1..-1]
|
94
|
-
table.inject({}) do |machine, actions|
|
95
|
-
state = actions.shift
|
96
|
-
machine[state] = Hash[*events.zip(actions).flatten]
|
97
|
-
machine
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def transition_table(name)
|
102
|
-
state_machine_reader = StateMachineReader.new
|
103
|
-
lexer = Gherkin::I18nLexer.lexer_class('en', false).new(state_machine_reader)
|
104
|
-
lexer.scan(File.read(File.dirname(__FILE__) + "/parser/#{name}.txt"))
|
105
|
-
state_machine_reader.rows
|
106
|
-
end
|
107
|
-
|
108
|
-
class StateMachineReader
|
109
|
-
attr_reader :rows
|
110
|
-
|
111
|
-
def initialize
|
112
|
-
@rows = []
|
113
|
-
end
|
114
|
-
|
115
|
-
def row(row, line_number)
|
116
|
-
@rows << row
|
117
|
-
end
|
118
|
-
|
119
|
-
def eof
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
data/spec/gherkin/parser_spec.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'gherkin/parser'
|
3
|
-
|
4
|
-
module Gherkin
|
5
|
-
describe Parser do
|
6
|
-
before do
|
7
|
-
@listener = mock('listener')
|
8
|
-
@parser = Parser.new(@listener, true)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should delegate events to the listener" do
|
12
|
-
@listener.should_receive(:comment).with("# Content", 1)
|
13
|
-
@parser.comment("# Content", 1)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should raise helpful error messages by default" do
|
17
|
-
lambda {
|
18
|
-
@parser.scenario("Scenario", "My pet scenario", 12)
|
19
|
-
}.should raise_error(/Parse error on line 12\. Found scenario when expecting one of: comment, feature, tag\. \(Current state: root\)\.$/)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should allow empty files" do
|
23
|
-
@listener.should_receive(:eof)
|
24
|
-
@parser.eof
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should delegate an error message when raise on error is false" do
|
28
|
-
@listener.should_receive(:syntax_error).with(sym(:root), sym(:background), a([:comment, :feature, :tag]), 1)
|
29
|
-
@parser = Parser.new(@listener, false)
|
30
|
-
@parser.background("Background", "Content", 1)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|