gherkin 2.3.7 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.yardopts +5 -0
- data/{History.txt → History.md} +153 -127
- data/{README.rdoc → README.md} +66 -64
- data/Rakefile +9 -2
- data/features/json_formatter.feature +1 -1
- data/features/json_parser.feature +1 -1
- data/gherkin.gemspec +16 -14
- data/js/lib/gherkin/lexer/.npmignore +0 -0
- 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 +2 -2
- data/ragel/lexer.java.rl.erb +2 -2
- data/ragel/lexer.js.rl.erb +8 -6
- data/ragel/lexer.rb.rl.erb +2 -2
- 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 +2 -2
- 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 +2 -2
- data/tasks/ikvm.rake +4 -4
- data/tasks/ragel_task.rb +7 -0
- data/tasks/release.rake +10 -9
- 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 +53 -26
- data/VERSION +0 -1
- data/lib/gherkin/version.rb +0 -3
- 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,26 +76,28 @@ 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
|
|
98
96
|
rake js/lib/gherkin/lexer/en.js
|
99
97
|
|
100
|
-
|
98
|
+
TODO: Make all specs pass with js lexer - replace 'c(listener)' with 'js(listener)' in i18n.rb
|
99
|
+
|
100
|
+
### .NET and IronRuby
|
101
101
|
|
102
102
|
You must install Mono and IKVM to build the pure .NET dll and the IronRuby gem:
|
103
103
|
|
@@ -106,9 +106,9 @@ You must install Mono and IKVM to build the pure .NET dll and the IronRuby gem:
|
|
106
106
|
|
107
107
|
Now you can build the .NET dll with:
|
108
108
|
|
109
|
-
|
109
|
+
rake ikvm
|
110
110
|
|
111
|
-
|
111
|
+
### MinGW Rubies (for Windows gems)
|
112
112
|
|
113
113
|
In order to build Windows binaries (so we can release Windows gems from OS X/Linux) we need to set up rake-compiler.
|
114
114
|
|
@@ -125,46 +125,48 @@ First you need to download and install MinGW:
|
|
125
125
|
OS X users can get it from http://crossgcc.rts-software.org/doku.php
|
126
126
|
Once you have installed it, add this to your .bashrc:
|
127
127
|
|
128
|
-
|
128
|
+
export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin
|
129
129
|
|
130
130
|
Now, let's install some rubies.
|
131
131
|
Make sure you have openssl installed first.
|
132
132
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
157
157
|
|
158
158
|
* Make sure GHERKIN_JS is defined (see Javascript section above)
|
159
|
-
* Bump version in
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
*
|
164
|
-
*
|
159
|
+
* Bump version in:
|
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.
|
165
|
+
* bundle exec rake gems:prepare && ./build_native_gems.sh && bundle exec rake release:ALL
|
166
|
+
* The specs intermittently fail with a segfault from therubyracer. Running specs can be disabled with SKIP_JS_SPECS=true
|
165
167
|
* Announce on Cucumber list, IRC and Twitter.
|
166
168
|
|
167
|
-
|
169
|
+
## Note on Patches/Pull Requests
|
168
170
|
|
169
171
|
* Fork the project.
|
170
172
|
* Run rake ragel:rb to generate all the I18n lexers
|
@@ -173,9 +175,9 @@ Make sure you have openssl installed first.
|
|
173
175
|
future version unintentionally.
|
174
176
|
* Commit, do not mess with Rakefile, VERSION, or History.txt.
|
175
177
|
(if you want to have your own version, that is fine but
|
176
|
-
|
178
|
+
bump version in a commit by itself I can ignore when I pull)
|
177
179
|
* Send me a pull request. Bonus points for topic branches.
|
178
180
|
|
179
|
-
|
181
|
+
## Copyright
|
180
182
|
|
181
183
|
Copyright (c) 2009-2010 Mike Sassak, Gregory Hnatiuk, Aslak Hellesøy. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
GHERKIN_VERSION = Gem::Specification.load(File.dirname(__FILE__) + '/gherkin.gemspec').version.version
|
2
3
|
require 'rubygems'
|
3
|
-
require 'bundler'
|
4
4
|
unless ENV['RUBY_CC_VERSION']
|
5
|
+
require 'bundler'
|
5
6
|
Bundler.setup
|
6
7
|
Bundler::GemHelper.install_tasks
|
7
8
|
end
|
@@ -9,8 +10,14 @@ ENV['RUBYOPT'] = nil # Necessary to prevent Bundler from *&^%$#ing up rake-compi
|
|
9
10
|
|
10
11
|
require 'rake/clean'
|
11
12
|
|
13
|
+
begin
|
14
|
+
# Support Rake >= 0.9.0
|
15
|
+
require 'rake/dsl_definition'
|
16
|
+
include Rake::DSL
|
17
|
+
rescue LoadError
|
18
|
+
end
|
19
|
+
|
12
20
|
$:.unshift(File.dirname(__FILE__) + '/lib')
|
13
|
-
require 'gherkin/version'
|
14
21
|
|
15
22
|
Dir['tasks/**/*.rake'].each { |rake| load File.expand_path(rake) }
|
16
23
|
|
data/gherkin.gemspec
CHANGED
@@ -1,16 +1,13 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
gherkin_dir = Dir.pwd =~ /gherkin\/tmp/ ? File.expand_path("../../../..", Dir.pwd) : File.expand_path("..", __FILE__)
|
3
|
-
$LOAD_PATH.unshift File.join(gherkin_dir, 'lib')
|
4
|
-
require "gherkin/version"
|
5
2
|
|
6
3
|
Gem::Specification.new do |s|
|
7
4
|
s.name = "gherkin"
|
8
|
-
s.version =
|
5
|
+
s.version = "2.4.0"
|
9
6
|
s.authors = ["Mike Sassak", "Gregory Hnatiuk", "Aslak Hellesøy"]
|
10
7
|
s.description = "A fast Gherkin lexer/parser for based on the Ragel State Machine Compiler."
|
11
|
-
s.summary = "
|
8
|
+
s.summary = "#{s.name}-#{s.version}"
|
12
9
|
s.email = "cukes@googlegroups.com"
|
13
|
-
s.homepage = "http://github.com/
|
10
|
+
s.homepage = "http://github.com/cucumber/gherkin"
|
14
11
|
|
15
12
|
s.rubygems_version = "1.3.7"
|
16
13
|
s.default_executable = "gherkin"
|
@@ -18,7 +15,6 @@ Gem::Specification.new do |s|
|
|
18
15
|
s.files = `git ls-files`.split("\n")
|
19
16
|
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
20
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
-
s.extra_rdoc_files = ["LICENSE", "README.rdoc", "History.txt"]
|
22
18
|
s.rdoc_options = ["--charset=UTF-8"]
|
23
19
|
s.require_path = "lib"
|
24
20
|
|
@@ -51,14 +47,20 @@ Gem::Specification.new do |s|
|
|
51
47
|
|
52
48
|
s.add_dependency('json', '>= 1.4.6')
|
53
49
|
|
54
|
-
s.add_development_dependency('cucumber', '>= 0.10.
|
55
|
-
s.add_development_dependency('rake', '
|
56
|
-
s.add_development_dependency('bundler', '>= 1.0.
|
57
|
-
s.add_development_dependency('rspec', '>= 2.
|
58
|
-
s.add_development_dependency('awesome_print', '>= 0.
|
59
|
-
|
50
|
+
s.add_development_dependency('cucumber', '>= 0.10.3')
|
51
|
+
s.add_development_dependency('rake', '= 0.8.7')
|
52
|
+
s.add_development_dependency('bundler', '>= 1.0.14')
|
53
|
+
s.add_development_dependency('rspec', '>= 2.6.0')
|
54
|
+
s.add_development_dependency('awesome_print', '>= 0.4.0')
|
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
|
60
62
|
|
61
63
|
# Only needed by Cucumber. Remove when Cucumber no longer needs those.
|
62
64
|
s.add_development_dependency('term-ansicolor', '>= 1.0.5')
|
63
|
-
s.add_development_dependency('builder', '>=
|
65
|
+
s.add_development_dependency('builder', '>= 2.1.2')
|
64
66
|
end
|
File without changes
|
@@ -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 |
|