gherkin 1.0.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/.gitignore +7 -0
  2. data/.mailmap +2 -0
  3. data/History.txt +9 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +38 -0
  6. data/Rakefile +48 -0
  7. data/VERSION.yml +4 -0
  8. data/bin/gherkin +5 -0
  9. data/cucumber.yml +3 -0
  10. data/features/feature_parser.feature +206 -0
  11. data/features/native_lexer.feature +19 -0
  12. data/features/parser_with_native_lexer.feature +205 -0
  13. data/features/pretty_printer.feature +14 -0
  14. data/features/step_definitions/gherkin_steps.rb +34 -0
  15. data/features/step_definitions/pretty_printer_steps.rb +56 -0
  16. data/features/steps_parser.feature +46 -0
  17. data/features/support/env.rb +33 -0
  18. data/gherkin.gemspec +155 -0
  19. data/java/.gitignore +2 -0
  20. data/java/Gherkin.iml +24 -0
  21. data/java/build.xml +13 -0
  22. data/java/src/gherkin/FixJava.java +34 -0
  23. data/java/src/gherkin/Lexer.java +5 -0
  24. data/java/src/gherkin/LexingError.java +7 -0
  25. data/java/src/gherkin/Listener.java +27 -0
  26. data/java/src/gherkin/ParseError.java +22 -0
  27. data/java/src/gherkin/Parser.java +185 -0
  28. data/java/src/gherkin/lexer/.gitignore +1 -0
  29. data/java/src/gherkin/parser/StateMachineReader.java +62 -0
  30. data/lib/.gitignore +4 -0
  31. data/lib/gherkin.rb +2 -0
  32. data/lib/gherkin/c_lexer.rb +10 -0
  33. data/lib/gherkin/cli/main.rb +34 -0
  34. data/lib/gherkin/core_ext/array.rb +5 -0
  35. data/lib/gherkin/i18n.rb +87 -0
  36. data/lib/gherkin/i18n.yml +535 -0
  37. data/lib/gherkin/i18n_lexer.rb +29 -0
  38. data/lib/gherkin/java_lexer.rb +10 -0
  39. data/lib/gherkin/lexer.rb +44 -0
  40. data/lib/gherkin/parser.rb +19 -0
  41. data/lib/gherkin/parser/meta.txt +4 -0
  42. data/lib/gherkin/parser/root.txt +9 -0
  43. data/lib/gherkin/parser/steps.txt +3 -0
  44. data/lib/gherkin/rb_lexer.rb +10 -0
  45. data/lib/gherkin/rb_lexer/.gitignore +1 -0
  46. data/lib/gherkin/rb_lexer/README.rdoc +8 -0
  47. data/lib/gherkin/rb_parser.rb +117 -0
  48. data/lib/gherkin/tools.rb +8 -0
  49. data/lib/gherkin/tools/files.rb +30 -0
  50. data/lib/gherkin/tools/pretty_listener.rb +84 -0
  51. data/lib/gherkin/tools/reformat.rb +19 -0
  52. data/lib/gherkin/tools/stats.rb +21 -0
  53. data/lib/gherkin/tools/stats_listener.rb +50 -0
  54. data/nativegems.sh +5 -0
  55. data/ragel/i18n/.gitignore +1 -0
  56. data/ragel/lexer.c.rl.erb +403 -0
  57. data/ragel/lexer.java.rl.erb +200 -0
  58. data/ragel/lexer.rb.rl.erb +171 -0
  59. data/ragel/lexer_common.rl.erb +46 -0
  60. data/spec/gherkin/c_lexer_spec.rb +21 -0
  61. data/spec/gherkin/fixtures/1.feature +8 -0
  62. data/spec/gherkin/fixtures/complex.feature +43 -0
  63. data/spec/gherkin/fixtures/i18n_fr.feature +13 -0
  64. data/spec/gherkin/fixtures/i18n_no.feature +6 -0
  65. data/spec/gherkin/fixtures/i18n_zh-CN.feature +8 -0
  66. data/spec/gherkin/fixtures/simple.feature +3 -0
  67. data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
  68. data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
  69. data/spec/gherkin/i18n_lexer_spec.rb +22 -0
  70. data/spec/gherkin/i18n_spec.rb +57 -0
  71. data/spec/gherkin/java_lexer_spec.rb +20 -0
  72. data/spec/gherkin/parser_spec.rb +28 -0
  73. data/spec/gherkin/rb_lexer_spec.rb +18 -0
  74. data/spec/gherkin/sexp_recorder.rb +29 -0
  75. data/spec/gherkin/shared/lexer_spec.rb +433 -0
  76. data/spec/gherkin/shared/py_string_spec.rb +124 -0
  77. data/spec/gherkin/shared/table_spec.rb +97 -0
  78. data/spec/gherkin/shared/tags_spec.rb +50 -0
  79. data/spec/spec_helper.rb +53 -0
  80. data/tasks/bench.rake +186 -0
  81. data/tasks/bench/feature_builder.rb +49 -0
  82. data/tasks/bench/generated/.gitignore +1 -0
  83. data/tasks/bench/null_listener.rb +4 -0
  84. data/tasks/compile.rake +70 -0
  85. data/tasks/cucumber.rake +20 -0
  86. data/tasks/ragel_task.rb +70 -0
  87. data/tasks/rdoc.rake +12 -0
  88. data/tasks/rspec.rake +15 -0
  89. metadata +196 -0
@@ -0,0 +1,14 @@
1
+ Feature: Pretty printer
2
+ In order to have pretty gherkin
3
+ I want to verify that all prettified cucumber features parse OK
4
+
5
+ Scenario: Parse all the features in Cucumber
6
+ Given I have Cucumber's home dir defined in CUCUMBER_HOME
7
+ When I find all of the .feature files
8
+ And I parse the prettified representation of each of them
9
+ # Of course, we don't really want any errors. The last
10
+ # two files that were not identical are written to p1.feature
11
+ # and p2.feature. Do a diff -u p1.feature p2.feature
12
+ #
13
+ Then the following files should have errors:
14
+ | Path | Error |
@@ -0,0 +1,34 @@
1
+ Given /^a "([^\"]*)", "([^\"]*)" "([^\"]*)" parser$/ do |i18n_language, impl, parser_name|
2
+ parser = Gherkin::Parser.new(@listener, false, parser_name)
3
+ programming_language = {
4
+ 'ruby' => 'rb',
5
+ 'native' => (defined?(JRUBY_VERSION) ? 'java' : 'c')
6
+ }[impl]
7
+ @lexer = Gherkin::Lexer.send(programming_language)[i18n_language].new(parser)
8
+ end
9
+
10
+ Given "the following text is parsed:" do |text|
11
+ @lexer.scan(text)
12
+ end
13
+
14
+ Then "there should be no parse errors" do
15
+ @listener.errors.should == []
16
+ end
17
+
18
+ Then /^there should be a parse error on (line \d+)$/ do |line|
19
+ @listener.line(line).should include(:syntax_error, line)
20
+ end
21
+
22
+ Then /^there should be parse errors on (lines .*)$/ do |lines|
23
+ lines.each do |line|
24
+ Then "there should be a parse error on line #{line}"
25
+ end
26
+ end
27
+
28
+ Transform /^line \d+$/ do |step_arg|
29
+ tr_line_number(step_arg)
30
+ end
31
+
32
+ Transform /^lines .*$/ do |step_arg|
33
+ tr_line_numbers(step_arg)
34
+ end
@@ -0,0 +1,56 @@
1
+ require 'stringio'
2
+ require 'gherkin'
3
+ require 'gherkin/tools/pretty_listener'
4
+
5
+ module PrettyPlease
6
+ def pretty(source)
7
+ io = StringIO.new
8
+ listener = Gherkin::Tools::PrettyListener.new(io)
9
+ parser = Gherkin::Parser.new(listener, true)
10
+ lexer = Gherkin::I18nLexer.new(parser)
11
+ lexer.scan(source)
12
+ io.rewind
13
+ io.read
14
+ end
15
+ end
16
+
17
+ World(PrettyPlease)
18
+
19
+ Given /^I have Cucumber's home dir defined in CUCUMBER_HOME$/ do
20
+ @cucumber_home = ENV['CUCUMBER_HOME']
21
+ raise "No CUCUMBER_HOME" if @cucumber_home.nil?
22
+ end
23
+
24
+ When /^I find all of the \.feature files$/ do
25
+ @features = Dir["#{@cucumber_home}/**/*.feature"].sort
26
+ end
27
+
28
+ When /^I parse the prettified representation of each of them$/ do
29
+ @errors = [['Path', 'Error']]
30
+ @features.each do |feature|
31
+ pretty1 = nil
32
+ pretty2 = nil
33
+ begin
34
+ # announce "========== #{feature}:"
35
+ pretty1 = pretty(IO.read(feature))
36
+ pretty2 = pretty(pretty1)
37
+ pretty2.should == pretty1
38
+ rescue Spec::Expectations::ExpectationNotMetError => e
39
+ File.open("p1.feature", "w") {|io| io.write(pretty1)}
40
+ File.open("p2.feature", "w") {|io| io.write(pretty2)}
41
+ announce "========== #{feature}:"
42
+ if(e.message =~ /(@@.*)/m)
43
+ announce $1
44
+ else
45
+ announce "??? NO DIFF ???"
46
+ end
47
+ @errors << [feature, "See announced diff"]
48
+ rescue => e
49
+ @errors << [feature, e.message]
50
+ end
51
+ end
52
+ end
53
+
54
+ Then /^the following files should have errors:$/ do |table|
55
+ table.diff!(@errors)
56
+ end
@@ -0,0 +1,46 @@
1
+ Feature: Gherkin Steps parser
2
+ In order to save time and make my features clearer
3
+ As a Cucumber developer
4
+ I want a steps parser to make writing compound steps easier
5
+
6
+ Background:
7
+ Given a "en", "ruby" "steps" parser
8
+
9
+ Scenario: Parsing steps
10
+ Given the following text is parsed:
11
+ """
12
+ Given a one step
13
+ And a two step
14
+ \"\"\"
15
+ Here is a multiline string
16
+ That follows a step
17
+ With an argument #{arg}
18
+ \"\"\"
19
+ And a one two three step
20
+ When another step
21
+ Then there should be a table
22
+ | one | two | three |
23
+ | foo | bar | #{arg} |
24
+ """
25
+ Then there should be no parse errors
26
+
27
+ Scenario: Trying to parse a full feature with the step parser
28
+ Given the following text is parsed:
29
+ """
30
+ Feature: A Feature
31
+ Scenario: Yes, there is one
32
+ Given I have a step
33
+ When I execute this step
34
+ Then something should happen
35
+ """
36
+ Then there should be parse errors on lines 1 and 2
37
+
38
+ Scenario: Tags
39
+ Given the following text is parsed:
40
+ """
41
+ @a_tag
42
+ Given a step
43
+ When I trip
44
+ Then I should sign up for dancing lessons
45
+ """
46
+ Then there should be a parse error on line 1
@@ -0,0 +1,33 @@
1
+ # I'm sure there's a better way than this...
2
+ %w{/../../lib /../../spec/gherkin}.each do |path|
3
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + path)
4
+ end
5
+
6
+ require 'gherkin'
7
+ require "sexp_recorder"
8
+
9
+ module TransformHelpers
10
+ def tr_line_number(step_arg)
11
+ /(\d+)$/.match(step_arg)[0].to_i
12
+ end
13
+
14
+ def tr_line_numbers(step_arg)
15
+ if step_arg =~ /through/
16
+ Range.new(*step_arg.scan(/\d+/).collect { |i| i.to_i })
17
+ else
18
+ step_arg.scan(/\d+/).collect { |i| i.to_i }
19
+ end
20
+ end
21
+ end
22
+
23
+ class GherkinWorld
24
+ include TransformHelpers
25
+
26
+ def initialize
27
+ @listener = Gherkin::SexpRecorder.new
28
+ end
29
+ end
30
+
31
+ World do
32
+ GherkinWorld.new
33
+ end
@@ -0,0 +1,155 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{gherkin}
8
+ s.version = "1.0.2"
9
+ s.platform = %q{java}
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Mike Sassak", "Gregory Hnatiuk", "Aslak Helles\303\270y"]
13
+ s.date = %q{2009-12-30}
14
+ s.default_executable = %q{gherkin}
15
+ s.description = %q{A fast Gherkin lexer/parser based on the Ragel State Machine Compiler.}
16
+ s.email = %q{cukes@googlegroups.com}
17
+ s.executables = ["gherkin"]
18
+ s.extra_rdoc_files = [
19
+ "LICENSE",
20
+ "README.rdoc"
21
+ ]
22
+ s.files = [
23
+ ".gitignore",
24
+ ".mailmap",
25
+ "History.txt",
26
+ "LICENSE",
27
+ "README.rdoc",
28
+ "Rakefile",
29
+ "VERSION.yml",
30
+ "bin/gherkin",
31
+ "cucumber.yml",
32
+ "features/feature_parser.feature",
33
+ "features/native_lexer.feature",
34
+ "features/parser_with_native_lexer.feature",
35
+ "features/pretty_printer.feature",
36
+ "features/step_definitions/gherkin_steps.rb",
37
+ "features/step_definitions/pretty_printer_steps.rb",
38
+ "features/steps_parser.feature",
39
+ "features/support/env.rb",
40
+ "gherkin.gemspec",
41
+ "java/.gitignore",
42
+ "java/Gherkin.iml",
43
+ "java/build.xml",
44
+ "java/src/gherkin/FixJava.java",
45
+ "java/src/gherkin/Lexer.java",
46
+ "java/src/gherkin/LexingError.java",
47
+ "java/src/gherkin/Listener.java",
48
+ "java/src/gherkin/ParseError.java",
49
+ "java/src/gherkin/Parser.java",
50
+ "java/src/gherkin/lexer/.gitignore",
51
+ "java/src/gherkin/parser/StateMachineReader.java",
52
+ "lib/.gitignore",
53
+ "lib/gherkin.jar",
54
+ "lib/gherkin.rb",
55
+ "lib/gherkin/c_lexer.rb",
56
+ "lib/gherkin/cli/main.rb",
57
+ "lib/gherkin/core_ext/array.rb",
58
+ "lib/gherkin/i18n.rb",
59
+ "lib/gherkin/i18n.yml",
60
+ "lib/gherkin/i18n_lexer.rb",
61
+ "lib/gherkin/java_lexer.rb",
62
+ "lib/gherkin/lexer.rb",
63
+ "lib/gherkin/parser.rb",
64
+ "lib/gherkin/parser/meta.txt",
65
+ "lib/gherkin/parser/root.txt",
66
+ "lib/gherkin/parser/steps.txt",
67
+ "lib/gherkin/rb_lexer.rb",
68
+ "lib/gherkin/rb_lexer/.gitignore",
69
+ "lib/gherkin/rb_lexer/README.rdoc",
70
+ "lib/gherkin/rb_parser.rb",
71
+ "lib/gherkin/tools.rb",
72
+ "lib/gherkin/tools/files.rb",
73
+ "lib/gherkin/tools/pretty_listener.rb",
74
+ "lib/gherkin/tools/reformat.rb",
75
+ "lib/gherkin/tools/stats.rb",
76
+ "lib/gherkin/tools/stats_listener.rb",
77
+ "nativegems.sh",
78
+ "ragel/i18n/.gitignore",
79
+ "ragel/lexer.c.rl.erb",
80
+ "ragel/lexer.java.rl.erb",
81
+ "ragel/lexer.rb.rl.erb",
82
+ "ragel/lexer_common.rl.erb",
83
+ "spec/gherkin/c_lexer_spec.rb",
84
+ "spec/gherkin/fixtures/1.feature",
85
+ "spec/gherkin/fixtures/complex.feature",
86
+ "spec/gherkin/fixtures/i18n_fr.feature",
87
+ "spec/gherkin/fixtures/i18n_no.feature",
88
+ "spec/gherkin/fixtures/i18n_zh-CN.feature",
89
+ "spec/gherkin/fixtures/simple.feature",
90
+ "spec/gherkin/fixtures/simple_with_comments.feature",
91
+ "spec/gherkin/fixtures/simple_with_tags.feature",
92
+ "spec/gherkin/i18n_lexer_spec.rb",
93
+ "spec/gherkin/i18n_spec.rb",
94
+ "spec/gherkin/java_lexer_spec.rb",
95
+ "spec/gherkin/parser_spec.rb",
96
+ "spec/gherkin/rb_lexer_spec.rb",
97
+ "spec/gherkin/sexp_recorder.rb",
98
+ "spec/gherkin/shared/lexer_spec.rb",
99
+ "spec/gherkin/shared/py_string_spec.rb",
100
+ "spec/gherkin/shared/table_spec.rb",
101
+ "spec/gherkin/shared/tags_spec.rb",
102
+ "spec/spec_helper.rb",
103
+ "tasks/bench.rake",
104
+ "tasks/bench/feature_builder.rb",
105
+ "tasks/bench/generated/.gitignore",
106
+ "tasks/bench/null_listener.rb",
107
+ "tasks/compile.rake",
108
+ "tasks/cucumber.rake",
109
+ "tasks/ragel_task.rb",
110
+ "tasks/rdoc.rake",
111
+ "tasks/rspec.rake"
112
+ ]
113
+ s.homepage = %q{http://github.com/aslakhellesoy/gherkin}
114
+ s.rdoc_options = ["--charset=UTF-8"]
115
+ s.require_paths = ["lib"]
116
+ s.rubygems_version = %q{1.3.5}
117
+ s.summary = %q{Fast Gherkin lexer/parser}
118
+ s.test_files = [
119
+ "spec/gherkin/c_lexer_spec.rb",
120
+ "spec/gherkin/i18n_lexer_spec.rb",
121
+ "spec/gherkin/i18n_spec.rb",
122
+ "spec/gherkin/java_lexer_spec.rb",
123
+ "spec/gherkin/parser_spec.rb",
124
+ "spec/gherkin/rb_lexer_spec.rb",
125
+ "spec/gherkin/sexp_recorder.rb",
126
+ "spec/gherkin/shared/lexer_spec.rb",
127
+ "spec/gherkin/shared/py_string_spec.rb",
128
+ "spec/gherkin/shared/table_spec.rb",
129
+ "spec/gherkin/shared/tags_spec.rb",
130
+ "spec/spec_helper.rb"
131
+ ]
132
+
133
+ if s.respond_to? :specification_version then
134
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
135
+ s.specification_version = 3
136
+
137
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
138
+ s.add_runtime_dependency(%q<trollop>, [">= 1.15"])
139
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
140
+ s.add_development_dependency(%q<cucumber>, [">= 0.5.1"])
141
+ s.add_development_dependency(%q<rake-compiler>, [">= 0.7.0"])
142
+ else
143
+ s.add_dependency(%q<trollop>, [">= 1.15"])
144
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
145
+ s.add_dependency(%q<cucumber>, [">= 0.5.1"])
146
+ s.add_dependency(%q<rake-compiler>, [">= 0.7.0"])
147
+ end
148
+ else
149
+ s.add_dependency(%q<trollop>, [">= 1.15"])
150
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
151
+ s.add_dependency(%q<cucumber>, [">= 0.5.1"])
152
+ s.add_dependency(%q<rake-compiler>, [">= 0.7.0"])
153
+ end
154
+ end
155
+
@@ -0,0 +1,2 @@
1
+ .idea
2
+ target
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module relativePaths="true" type="JAVA_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$">
6
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7
+ <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
8
+ <excludeFolder url="file://$MODULE_DIR$/target" />
9
+ </content>
10
+ <orderEntry type="inheritedJdk" />
11
+ <orderEntry type="sourceFolder" forTests="false" />
12
+ <orderEntry type="module-library" scope="TEST">
13
+ <library>
14
+ <CLASSES>
15
+ <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.6.jar!/" />
16
+ </CLASSES>
17
+ <JAVADOC />
18
+ <SOURCES />
19
+ </library>
20
+ </orderEntry>
21
+ <orderEntry type="library" scope="TEST" name="Mockito" level="application" />
22
+ </component>
23
+ </module>
24
+
@@ -0,0 +1,13 @@
1
+ <project name="Gherkin" default="jar" basedir=".">
2
+ <target name="compile" description="Compile">
3
+ <mkdir dir="${basedir}/target/classes"/>
4
+ <javac srcdir="src" destdir="target/classes" debug="on"/>
5
+ </target>
6
+
7
+ <target name="jar" description="Jar" depends="compile">
8
+ <jar destfile="${basedir}/../lib/gherkin.jar">
9
+ <fileset dir="${basedir}/target/classes" />
10
+ <fileset dir="${basedir}/../lib" includes="gherkin/parser/*.txt" />
11
+ </jar>
12
+ </target>
13
+ </project>
@@ -0,0 +1,34 @@
1
+ package gherkin;
2
+
3
+ import java.io.IOException;
4
+ import java.io.InputStreamReader;
5
+ import java.io.Reader;
6
+ import java.util.List;
7
+
8
+ public class FixJava {
9
+ public static String join(List<String> strings, String separator) {
10
+ StringBuilder sb = new StringBuilder();
11
+ int i = 0;
12
+ for (String s : strings) {
13
+ if (i != 0) sb.append(separator);
14
+ sb.append(s);
15
+ i++;
16
+ }
17
+ return sb.toString();
18
+ }
19
+
20
+ public static String readResourceAsString(String filePath) throws IOException {
21
+ Reader machine = new InputStreamReader(FixJava.class.getResourceAsStream(filePath));
22
+
23
+ final char[] buffer = new char[0x10000];
24
+ StringBuilder sb = new StringBuilder();
25
+ int read;
26
+ do {
27
+ read = machine.read(buffer, 0, buffer.length);
28
+ if (read > 0) {
29
+ sb.append(buffer, 0, read);
30
+ }
31
+ } while (read >= 0);
32
+ return sb.toString();
33
+ }
34
+ }
@@ -0,0 +1,5 @@
1
+ package gherkin;
2
+
3
+ public interface Lexer {
4
+ public void scan(CharSequence inputSequence);
5
+ }
@@ -0,0 +1,7 @@
1
+ package gherkin;
2
+
3
+ public class LexingError extends RuntimeException {
4
+ public LexingError(String message) {
5
+ super(message);
6
+ }
7
+ }
@@ -0,0 +1,27 @@
1
+ package gherkin;
2
+
3
+ import java.util.List;
4
+
5
+ public interface Listener {
6
+ void tag(String name, int line);
7
+
8
+ void comment(String content, int line);
9
+
10
+ void feature(String keyword, String name, int line);
11
+
12
+ void background(String keyword, String name, int line);
13
+
14
+ void scenario(String keyword, String name, int line);
15
+
16
+ void scenario_outline(String keyword, String name, int line);
17
+
18
+ void examples(String keyword, String name, int line);
19
+
20
+ void step(String keyword, String name, int line);
21
+
22
+ void table(List<List<String>> rows, int line);
23
+
24
+ void py_string(String string, int line);
25
+
26
+ void syntax_error(String state, String event, List<String> legalEvents, int line);
27
+ }