gherkin 2.3.10-x86-mingw32 → 2.4.0-x86-mingw32
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.
- data/.gitignore +2 -0
- data/.yardopts +5 -0
- data/{History.txt → History.md} +144 -133
- data/{README.rdoc → README.md} +62 -64
- data/Rakefile +1 -1
- data/features/json_formatter.feature +1 -1
- data/features/json_parser.feature +1 -1
- data/gherkin.gemspec +8 -3
- data/lib/gherkin/formatter/ansi_escapes.rb +1 -1
- data/lib/gherkin/formatter/model.rb +4 -4
- data/lib/gherkin/formatter/pretty_formatter.rb +4 -4
- data/lib/gherkin/json_parser.rb +1 -1
- data/lib/gherkin/listener/formatter_listener.rb +7 -7
- data/lib/gherkin/parser/meta.txt +1 -1
- data/lib/gherkin/parser/root.txt +1 -1
- data/lib/gherkin/parser/steps.txt +1 -1
- data/lib/gherkin/rubify.rb +2 -2
- data/ragel/lexer.c.rl.erb +1 -1
- data/ragel/lexer.java.rl.erb +1 -1
- data/ragel/lexer.js.rl.erb +2 -2
- data/ragel/lexer.rb.rl.erb +1 -1
- data/ragel/lexer_common.rl.erb +4 -4
- data/spec/gherkin/c_lexer_spec.rb +1 -1
- data/spec/gherkin/fixtures/complex.json +1 -1
- data/spec/gherkin/java_lexer_spec.rb +1 -1
- data/spec/gherkin/js_lexer_spec.rb +1 -1
- data/spec/gherkin/rb_lexer_spec.rb +1 -1
- data/spec/gherkin/sexp_recorder.rb +2 -2
- data/spec/gherkin/shared/{py_string_group.rb → doc_string_group.rb} +28 -28
- data/spec/gherkin/shared/lexer_group.rb +4 -4
- data/spec/spec_helper.rb +1 -1
- data/tasks/compile.rake +3 -2
- data/tasks/cucumber.rake +1 -1
- data/tasks/gems.rake +1 -1
- data/tasks/release.rake +8 -1
- data/tasks/yard.rake +7 -0
- data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
- data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
- data/tasks/yard/default/layout/html/footer.erb +5 -0
- data/tasks/yard/default/layout/html/index.erb +1 -0
- data/tasks/yard/default/layout/html/layout.erb +25 -0
- data/tasks/yard/default/layout/html/logo.erb +1 -0
- data/tasks/yard/default/layout/html/setup.rb +4 -0
- metadata +45 -17
- data/tasks/rdoc.rake +0 -9
data/{README.rdoc → README.md}
RENAMED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Fast Gherkin lexer and parser based on Ragel. Gherkin is two things:
|
1
|
+
A fast lexer and parser for the Gherkin language based on Ragel. Gherkin is two things:
|
4
2
|
|
5
3
|
* The language that has evolved out of the Cucumber project.
|
6
4
|
* This library
|
@@ -13,7 +11,7 @@ Supported platforms:
|
|
13
11
|
* .NET
|
14
12
|
* IronRuby (experimental)
|
15
13
|
|
16
|
-
|
14
|
+
## Installing the toolchain
|
17
15
|
|
18
16
|
Due to the cross-platform nature of this library, you have to install a lot of tools to build gherkin yourself.
|
19
17
|
In order to make it easier for occasional contributors to get the development environment up and running, you don't
|
@@ -21,7 +19,7 @@ have to install everything up front. The build scripts should tell you if you ar
|
|
21
19
|
you shouldn't have to install MinGW to build windows binaries if you are a Linux user and just want to fix a bug in
|
22
20
|
the C code.
|
23
21
|
|
24
|
-
|
22
|
+
### Common dependencies
|
25
23
|
|
26
24
|
These are the minimal tools you need to install:
|
27
25
|
|
@@ -32,42 +30,42 @@ These are the minimal tools you need to install:
|
|
32
30
|
|
33
31
|
With this minimal toolchain installed, install Ruby gems needed by the build:
|
34
32
|
|
35
|
-
|
36
|
-
|
33
|
+
gem install bundler
|
34
|
+
bundle install
|
37
35
|
|
38
36
|
Running RSpec and Cucumber tests
|
39
37
|
|
40
|
-
|
38
|
+
rake clean spec cucumber
|
41
39
|
|
42
40
|
If the RL_LANGS environment variable is set, only the parsers for the languages specified there will be built.
|
43
41
|
E.g. in Bash, export RL_LANGS="en,fr,no". This can be quite helpful when modifying the Ragel grammar.
|
44
42
|
|
45
43
|
See subsections for building for a specific platform.
|
46
44
|
|
47
|
-
|
45
|
+
### MRI, REE or Rubinius
|
48
46
|
|
49
47
|
You'll need GCC installed.
|
50
48
|
|
51
49
|
Build the gem with:
|
52
50
|
|
53
|
-
|
51
|
+
rake build
|
54
52
|
|
55
|
-
|
53
|
+
### Pure Java and JRuby
|
56
54
|
|
57
55
|
You must install JRuby to build the pure Java jar or the JRuby gem:
|
58
56
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
57
|
+
rvm install jruby
|
58
|
+
rvm use jruby
|
59
|
+
rvm gemset create cucumber
|
60
|
+
rvm use @cucumber
|
61
|
+
gem install bundler
|
62
|
+
bundle install
|
65
63
|
|
66
64
|
Now you can build the jar with:
|
67
65
|
|
68
|
-
|
66
|
+
rake clean jar
|
69
67
|
|
70
|
-
|
68
|
+
### Javascript
|
71
69
|
|
72
70
|
In order to build and test Gherkin for Javascript you must install:
|
73
71
|
|
@@ -78,20 +76,20 @@ In order to build and test Gherkin for Javascript you must install:
|
|
78
76
|
|
79
77
|
Now you can build the Javascript with:
|
80
78
|
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
rake js
|
80
|
+
cd js
|
81
|
+
npm install
|
84
82
|
|
85
83
|
And you can try it out with node.js:
|
86
84
|
|
87
|
-
|
85
|
+
node js/example/print.js spec/gherkin/fixtures/1.feature
|
88
86
|
|
89
87
|
You can also try out Gherkin running in the browser (likely to move to a separate project):
|
90
88
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
89
|
+
# Pull in the Ace (http://ace.ajax.org/) editor:
|
90
|
+
git submodule update --init
|
91
|
+
# Open a sample Gherkin-powered editor in Chrome
|
92
|
+
open js/example/index.html
|
95
93
|
|
96
94
|
If you're hacking and just want to rebuild the English parser:
|
97
95
|
|
@@ -99,7 +97,7 @@ If you're hacking and just want to rebuild the English parser:
|
|
99
97
|
|
100
98
|
TODO: Make all specs pass with js lexer - replace 'c(listener)' with 'js(listener)' in i18n.rb
|
101
99
|
|
102
|
-
|
100
|
+
### .NET and IronRuby
|
103
101
|
|
104
102
|
You must install Mono and IKVM to build the pure .NET dll and the IronRuby gem:
|
105
103
|
|
@@ -108,9 +106,9 @@ You must install Mono and IKVM to build the pure .NET dll and the IronRuby gem:
|
|
108
106
|
|
109
107
|
Now you can build the .NET dll with:
|
110
108
|
|
111
|
-
|
109
|
+
rake ikvm
|
112
110
|
|
113
|
-
|
111
|
+
### MinGW Rubies (for Windows gems)
|
114
112
|
|
115
113
|
In order to build Windows binaries (so we can release Windows gems from OS X/Linux) we need to set up rake-compiler.
|
116
114
|
|
@@ -127,48 +125,48 @@ First you need to download and install MinGW:
|
|
127
125
|
OS X users can get it from http://crossgcc.rts-software.org/doku.php
|
128
126
|
Once you have installed it, add this to your .bashrc:
|
129
127
|
|
130
|
-
|
128
|
+
export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin
|
131
129
|
|
132
130
|
Now, let's install some rubies.
|
133
131
|
Make sure you have openssl installed first.
|
134
132
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
133
|
+
brew install openssl
|
134
|
+
|
135
|
+
# 1.8.6
|
136
|
+
# Don't worry about inconsistent patchlevels here. It works.
|
137
|
+
rvm install 1.8.6-p399
|
138
|
+
rvm use 1.8.6-p399
|
139
|
+
rvm gemset create cucumber
|
140
|
+
rvm use @cucumber
|
141
|
+
gem install bundler
|
142
|
+
bundle install
|
143
|
+
rake-compiler cross-ruby VERSION=1.8.6-p287
|
144
|
+
|
145
|
+
# 1.9.1
|
146
|
+
# Later 1.9.1 patch levels or 1.9.2 don't compile on mingw.
|
147
|
+
# The compiled binaries should still work on 1.9.2
|
148
|
+
rvm install 1.9.1-p243
|
149
|
+
rvm use 1.9.1-p243
|
150
|
+
rvm gemset create cucumber
|
151
|
+
rvm use @cucumber
|
152
|
+
gem install bundler
|
153
|
+
bundle install
|
154
|
+
rake-compiler cross-ruby VERSION=1.9.1-p243
|
155
|
+
|
156
|
+
## Release process
|
159
157
|
|
160
158
|
* Make sure GHERKIN_JS is defined (see Javascript section above)
|
161
159
|
* Bump version in:
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
* Commit changes.
|
160
|
+
* gherkin.gemspec
|
161
|
+
* java/pom.xml
|
162
|
+
* ikvm/Gherkin/Gherkin.csproj (2 places)
|
163
|
+
* js/package.json
|
164
|
+
* Commit changes, otherwise you will get an error at the end when a tag is made.
|
167
165
|
* bundle exec rake gems:prepare && ./build_native_gems.sh && bundle exec rake release:ALL
|
168
|
-
|
166
|
+
* The specs intermittently fail with a segfault from therubyracer. Running specs can be disabled with SKIP_JS_SPECS=true
|
169
167
|
* Announce on Cucumber list, IRC and Twitter.
|
170
168
|
|
171
|
-
|
169
|
+
## Note on Patches/Pull Requests
|
172
170
|
|
173
171
|
* Fork the project.
|
174
172
|
* Run rake ragel:rb to generate all the I18n lexers
|
@@ -177,9 +175,9 @@ Make sure you have openssl installed first.
|
|
177
175
|
future version unintentionally.
|
178
176
|
* Commit, do not mess with Rakefile, VERSION, or History.txt.
|
179
177
|
(if you want to have your own version, that is fine but
|
180
|
-
|
178
|
+
bump version in a commit by itself I can ignore when I pull)
|
181
179
|
* Send me a pull request. Bonus points for topic branches.
|
182
180
|
|
183
|
-
|
181
|
+
## Copyright
|
184
182
|
|
185
183
|
Copyright (c) 2009-2010 Mike Sassak, Gregory Hnatiuk, Aslak Hellesøy. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
GHERKIN_VERSION = Gem::Specification.load(File.dirname(__FILE__) + '/gherkin.gemspec').version.version
|
3
3
|
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
4
|
unless ENV['RUBY_CC_VERSION']
|
5
|
+
require 'bundler'
|
6
6
|
Bundler.setup
|
7
7
|
Bundler::GemHelper.install_tasks
|
8
8
|
end
|
data/gherkin.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "gherkin"
|
5
|
-
s.version = "2.
|
5
|
+
s.version = "2.4.0"
|
6
6
|
s.authors = ["Mike Sassak", "Gregory Hnatiuk", "Aslak Hellesøy"]
|
7
7
|
s.description = "A fast Gherkin lexer/parser for based on the Ragel State Machine Compiler."
|
8
8
|
s.summary = "#{s.name}-#{s.version}"
|
@@ -15,7 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
-
s.extra_rdoc_files = ["LICENSE", "README.rdoc", "History.txt"]
|
19
18
|
s.rdoc_options = ["--charset=UTF-8"]
|
20
19
|
s.require_path = "lib"
|
21
20
|
|
@@ -53,7 +52,13 @@ Gem::Specification.new do |s|
|
|
53
52
|
s.add_development_dependency('bundler', '>= 1.0.14')
|
54
53
|
s.add_development_dependency('rspec', '>= 2.6.0')
|
55
54
|
s.add_development_dependency('awesome_print', '>= 0.4.0')
|
56
|
-
|
55
|
+
|
56
|
+
unless ENV['RUBY_CC_VERSION'] || defined?(JRUBY_VERSION)
|
57
|
+
s.add_development_dependency('therubyracer', '>= 0.9.0.beta7') if ENV['GHERKIN_JS']
|
58
|
+
# For Documentation:
|
59
|
+
s.add_development_dependency('yard', '= 0.7.1')
|
60
|
+
s.add_development_dependency('rdiscount', '= 1.6.8')
|
61
|
+
end
|
57
62
|
|
58
63
|
# Only needed by Cucumber. Remove when Cucumber no longer needs those.
|
59
64
|
s.add_development_dependency('term-ansicolor', '>= 1.0.5')
|
@@ -3,7 +3,7 @@ module Gherkin
|
|
3
3
|
# Defines aliases for ANSI coloured output. Default colours can be overridden by defining
|
4
4
|
# a <tt>GHERKIN_COLORS</tt> variable in your shell, very much like how you can
|
5
5
|
# tweak the familiar POSIX command <tt>ls</tt> with
|
6
|
-
#
|
6
|
+
# $LSCOLORS: http://linux-sxs.org/housekeeping/lscolors.html
|
7
7
|
#
|
8
8
|
# The colours that you can change are:
|
9
9
|
#
|
@@ -119,7 +119,7 @@ module Gherkin
|
|
119
119
|
case multiline_arg
|
120
120
|
when Array
|
121
121
|
range = range.first..multiline_arg[-1].line
|
122
|
-
when Model::
|
122
|
+
when Model::DocString
|
123
123
|
range = range.first..multiline_arg.line_range.last
|
124
124
|
end
|
125
125
|
range
|
@@ -144,8 +144,8 @@ module Gherkin
|
|
144
144
|
'type' => 'table',
|
145
145
|
'value' => hash['multiline_arg']
|
146
146
|
}
|
147
|
-
elsif
|
148
|
-
hash['multiline_arg']['type'] = '
|
147
|
+
elsif DocString === @multiline_arg
|
148
|
+
hash['multiline_arg']['type'] = 'doc_string'
|
149
149
|
end
|
150
150
|
hash
|
151
151
|
end
|
@@ -179,7 +179,7 @@ module Gherkin
|
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
|
-
class
|
182
|
+
class DocString < Hashable
|
183
183
|
native_impl('gherkin')
|
184
184
|
|
185
185
|
attr_reader :value, :line
|
@@ -111,8 +111,8 @@ module Gherkin
|
|
111
111
|
@step_printer.write_step(@io, text_format, arg_format, step.name, arguments)
|
112
112
|
@io.puts(indented_location(location, proceed))
|
113
113
|
case step.multiline_arg
|
114
|
-
when Model::
|
115
|
-
|
114
|
+
when Model::DocString
|
115
|
+
doc_string(step.multiline_arg)
|
116
116
|
when Array
|
117
117
|
table(step.multiline_arg)
|
118
118
|
end
|
@@ -180,8 +180,8 @@ module Gherkin
|
|
180
180
|
|
181
181
|
private
|
182
182
|
|
183
|
-
def
|
184
|
-
@io.puts " \"\"\"\n" + escape_triple_quotes(indent(
|
183
|
+
def doc_string(doc_string)
|
184
|
+
@io.puts " \"\"\"\n" + escape_triple_quotes(indent(doc_string.value, ' ')) + "\n \"\"\""
|
185
185
|
end
|
186
186
|
|
187
187
|
def exception(exception)
|
data/lib/gherkin/json_parser.rb
CHANGED
@@ -57,7 +57,7 @@ module Gherkin
|
|
57
57
|
if(ma['type'] == 'table')
|
58
58
|
step.multiline_arg = rows(ma['value'])
|
59
59
|
else
|
60
|
-
step.multiline_arg = Formatter::Model::
|
60
|
+
step.multiline_arg = Formatter::Model::DocString.new(ma['value'], ma['line'])
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
@@ -57,8 +57,8 @@ module Gherkin
|
|
57
57
|
@table << Formatter::Model::Row.new(grab_comments!, cells, line)
|
58
58
|
end
|
59
59
|
|
60
|
-
def
|
61
|
-
@
|
60
|
+
def doc_string(string, line)
|
61
|
+
@doc_string = Formatter::Model::DocString.new(string, line)
|
62
62
|
end
|
63
63
|
|
64
64
|
def eof
|
@@ -90,15 +90,15 @@ module Gherkin
|
|
90
90
|
table
|
91
91
|
end
|
92
92
|
|
93
|
-
def
|
94
|
-
|
95
|
-
@
|
96
|
-
|
93
|
+
def grab_doc_string!
|
94
|
+
doc_string = @doc_string
|
95
|
+
@doc_string = nil
|
96
|
+
doc_string
|
97
97
|
end
|
98
98
|
|
99
99
|
def replay_step_or_examples
|
100
100
|
if(@step_statement)
|
101
|
-
@step_statement.multiline_arg =
|
101
|
+
@step_statement.multiline_arg = grab_doc_string! || grab_rows!
|
102
102
|
@formatter.step(@step_statement)
|
103
103
|
@step_statement = nil
|
104
104
|
end
|
data/lib/gherkin/parser/meta.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
| | feature | background | scenario | scenario_outline | examples | step | row |
|
1
|
+
| | feature | background | scenario | scenario_outline | examples | step | row | doc_string | eof | comment | tag |
|
2
2
|
| meta | E | E | E | E | E | E | E | E | eof | comment | tag |
|
3
3
|
| comment | pop() | pop() | pop() | pop() | pop() | pop() | pop() | pop() | eof | pop() | tag |
|
4
4
|
| tag | pop() | E | pop() | pop() | pop() | E | E | E | E | E | tag |
|
data/lib/gherkin/parser/root.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
| | feature | background | scenario | scenario_outline | examples | step | row |
|
1
|
+
| | feature | background | scenario | scenario_outline | examples | step | row | doc_string | eof | comment | tag |
|
2
2
|
| root | feature | E | E | E | E | E | E | E | eof | push(meta) | push(meta) |
|
3
3
|
| feature | E | background | scenario | scenario_outline | E | E | E | E | eof | push(meta) | push(meta) |
|
4
4
|
| step | E | E | scenario | scenario_outline | E | step | step | step | eof | push(meta) | push(meta) |
|
@@ -1,4 +1,4 @@
|
|
1
|
-
| | feature | background | scenario | scenario_outline | examples | step | row |
|
1
|
+
| | feature | background | scenario | scenario_outline | examples | step | row | doc_string | eof | comment | tag |
|
2
2
|
| steps | E | E | E | E | E | step | E | E | eof | E | E |
|
3
3
|
| step | E | E | E | E | E | step | step | steps | eof | E | E |
|
4
4
|
| eof | E | E | E | E | E | E | E | E | E | E | E |
|
data/lib/gherkin/rubify.rb
CHANGED
@@ -8,9 +8,9 @@ module Gherkin
|
|
8
8
|
case(o)
|
9
9
|
when Java.java.util.Collection, Array
|
10
10
|
o.map{|e| rubify(e)}
|
11
|
-
when Java.gherkin.formatter.model.
|
11
|
+
when Java.gherkin.formatter.model.DocString
|
12
12
|
require 'gherkin/formatter/model'
|
13
|
-
Formatter::Model::
|
13
|
+
Formatter::Model::DocString.new(o.value, o.line)
|
14
14
|
else
|
15
15
|
o
|
16
16
|
end
|
data/ragel/lexer.c.rl.erb
CHANGED
@@ -328,7 +328,7 @@ store_pystring_content(VALUE listener,
|
|
328
328
|
unescape_escaped_quotes = rb_reg_regcomp(rb_str_new2("\\\\\"\\\\\"\\\\\""));
|
329
329
|
rb_funcall(con, rb_intern("sub!"), 2, re2, rb_str_new2(""));
|
330
330
|
rb_funcall(con, rb_intern("gsub!"), 2, unescape_escaped_quotes, rb_str_new2("\"\"\""));
|
331
|
-
rb_funcall(listener, rb_intern("
|
331
|
+
rb_funcall(listener, rb_intern("doc_string"), 2, con, INT2FIX(current_line));
|
332
332
|
}
|
333
333
|
|
334
334
|
static void
|
data/ragel/lexer.java.rl.erb
CHANGED
@@ -32,7 +32,7 @@ public class <%= @i18n.underscored_iso_code.upcase %> implements Lexer {
|
|
32
32
|
|
33
33
|
action store_pystring_content {
|
34
34
|
String con = unindent(startCol, substring(data, contentStart, nextKeywordStart-1).replaceFirst("(\\r?\\n)?([\\t ])*\\Z", "").replaceAll("\\\\\"\\\\\"\\\\\"", "\"\"\""));
|
35
|
-
listener.
|
35
|
+
listener.docString(con, currentLine);
|
36
36
|
}
|
37
37
|
|
38
38
|
action store_feature_content {
|
data/ragel/lexer.js.rl.erb
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
this.start_col,
|
24
24
|
this.bytesToString(data.slice(this.content_start, this.next_keyword_start-1)).replace(/(\r?\n)?([\t ])*$/, '').replace(/ESCAPED_TRIPLE_QUOTE/mg, '"""')
|
25
25
|
);
|
26
|
-
this.listener.
|
26
|
+
this.listener.doc_string(con, this.current_line);
|
27
27
|
}
|
28
28
|
|
29
29
|
action store_feature_content {
|
@@ -122,7 +122,7 @@
|
|
122
122
|
|
123
123
|
var Lexer = function(listener) {
|
124
124
|
// Check that listener has the required functions
|
125
|
-
var events = ['comment', 'tag', 'feature', 'background', 'scenario', 'scenario_outline', 'examples', 'step', '
|
125
|
+
var events = ['comment', 'tag', 'feature', 'background', 'scenario', 'scenario_outline', 'examples', 'step', 'doc_string', 'row', 'eof'];
|
126
126
|
for(e in events) {
|
127
127
|
var event = events[e];
|
128
128
|
if(typeof listener[event] != 'function') {
|