gherkin 2.3.7 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +3 -0
  2. data/.yardopts +5 -0
  3. data/{History.txt → History.md} +153 -127
  4. data/{README.rdoc → README.md} +66 -64
  5. data/Rakefile +9 -2
  6. data/features/json_formatter.feature +1 -1
  7. data/features/json_parser.feature +1 -1
  8. data/gherkin.gemspec +16 -14
  9. data/js/lib/gherkin/lexer/.npmignore +0 -0
  10. data/lib/gherkin/formatter/ansi_escapes.rb +1 -1
  11. data/lib/gherkin/formatter/model.rb +4 -4
  12. data/lib/gherkin/formatter/pretty_formatter.rb +4 -4
  13. data/lib/gherkin/json_parser.rb +1 -1
  14. data/lib/gherkin/listener/formatter_listener.rb +7 -7
  15. data/lib/gherkin/parser/meta.txt +1 -1
  16. data/lib/gherkin/parser/root.txt +1 -1
  17. data/lib/gherkin/parser/steps.txt +1 -1
  18. data/lib/gherkin/rubify.rb +2 -2
  19. data/ragel/lexer.c.rl.erb +2 -2
  20. data/ragel/lexer.java.rl.erb +2 -2
  21. data/ragel/lexer.js.rl.erb +8 -6
  22. data/ragel/lexer.rb.rl.erb +2 -2
  23. data/ragel/lexer_common.rl.erb +4 -4
  24. data/spec/gherkin/c_lexer_spec.rb +1 -1
  25. data/spec/gherkin/fixtures/complex.json +1 -1
  26. data/spec/gherkin/java_lexer_spec.rb +1 -1
  27. data/spec/gherkin/js_lexer_spec.rb +2 -2
  28. data/spec/gherkin/rb_lexer_spec.rb +1 -1
  29. data/spec/gherkin/sexp_recorder.rb +2 -2
  30. data/spec/gherkin/shared/{py_string_group.rb → doc_string_group.rb} +28 -28
  31. data/spec/gherkin/shared/lexer_group.rb +4 -4
  32. data/spec/spec_helper.rb +1 -1
  33. data/tasks/compile.rake +3 -2
  34. data/tasks/cucumber.rake +1 -1
  35. data/tasks/gems.rake +2 -2
  36. data/tasks/ikvm.rake +4 -4
  37. data/tasks/ragel_task.rb +7 -0
  38. data/tasks/release.rake +10 -9
  39. data/tasks/yard.rake +7 -0
  40. data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  41. data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
  42. data/tasks/yard/default/layout/html/footer.erb +5 -0
  43. data/tasks/yard/default/layout/html/index.erb +1 -0
  44. data/tasks/yard/default/layout/html/layout.erb +25 -0
  45. data/tasks/yard/default/layout/html/logo.erb +1 -0
  46. data/tasks/yard/default/layout/html/setup.rb +4 -0
  47. metadata +53 -26
  48. data/VERSION +0 -1
  49. data/lib/gherkin/version.rb +0 -3
  50. data/tasks/rdoc.rake +0 -9
@@ -1,6 +1,4 @@
1
- = Gherkin
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
- == Installing the toolchain
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
- === Common dependencies
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
- gem install bundler
36
- bundle install
33
+ gem install bundler
34
+ bundle install
37
35
 
38
36
  Running RSpec and Cucumber tests
39
37
 
40
- rake clean spec cucumber
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
- === MRI, REE or Rubinius
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
- rake build
51
+ rake build
54
52
 
55
- === Pure Java and JRuby
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
- rvm install jruby
60
- rvm use jruby
61
- rvm gemset create cucumber
62
- rvm use @cucumber
63
- gem install bundler
64
- bundle install
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
- rake clean jar
66
+ rake clean jar
69
67
 
70
- === Javascript
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
- rake js
82
- cd js
83
- npm install
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
- node js/example/print.js spec/gherkin/fixtures/1.feature
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
- # Pull in the Ace (http://ace.ajax.org/) editor:
92
- git submodule update --init
93
- # Open a sample Gherkin-powered editor in Chrome
94
- open js/example/index.html
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
- === .NET and IronRuby
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
- rake ikvm
109
+ rake ikvm
110
110
 
111
- === MinGW Rubies (for Windows gems)
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
- export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin
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
- 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
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 the VERSION file and:
160
- ** java/pom.xml
161
- ** ikvm/Gherkin/Gherkin.csproj (2 places)
162
- ** js/package.json
163
- * Commit changes.
164
- * rake gems:prepare && ./build_native_gems.sh && rake release:ALL
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
- == Note on Patches/Pull Requests
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
- bump version in a commit by itself I can ignore when I pull)
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
- == Copyright
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
 
@@ -180,7 +180,7 @@ Feature: JSON formatter
180
180
  "name": "so",
181
181
  "line": 26,
182
182
  "multiline_arg": {
183
- "type": "py_string",
183
+ "type": "doc_string",
184
184
  "value": "innocent",
185
185
  "line": 27
186
186
  }
@@ -161,7 +161,7 @@ Feature: JSON lexer
161
161
  "name": "so",
162
162
  "line": 26,
163
163
  "multiline_arg": {
164
- "type": "py_string",
164
+ "type": "doc_string",
165
165
  "value": "innocent",
166
166
  "line": 27
167
167
  }
@@ -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 = Gherkin::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 = "gherkin-#{Gherkin::VERSION}"
8
+ s.summary = "#{s.name}-#{s.version}"
12
9
  s.email = "cukes@googlegroups.com"
13
- s.homepage = "http://github.com/aslakhellesoy/gherkin"
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.0')
55
- s.add_development_dependency('rake', '>= 0.8.7')
56
- s.add_development_dependency('bundler', '>= 1.0.10')
57
- s.add_development_dependency('rspec', '>= 2.5.0')
58
- s.add_development_dependency('awesome_print', '>= 0.3')
59
- s.add_development_dependency('therubyracer', '>= 0.8.2.pre2') if ENV['GHERKIN_JS'] && !defined?(JRUBY_VERSION)
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', '>= 3.0.0')
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
- # <a href="http://mipsisrisc.com/rambling/2008/06/27/lscolorsls_colors-now-with-linux-support/">$LSCOLORS/$LS_COLORS</a>
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::PyString
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 PyString === @multiline_arg
148
- hash['multiline_arg']['type'] = 'py_string'
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 PyString < Hashable
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::PyString
115
- py_string(step.multiline_arg)
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 py_string(py_string)
184
- @io.puts " \"\"\"\n" + escape_triple_quotes(indent(py_string.value, ' ')) + "\n \"\"\""
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)
@@ -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::PyString.new(ma['value'], ma['line'])
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 py_string(string, line)
61
- @py_string = Formatter::Model::PyString.new(string, line)
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 grab_py_string!
94
- py_string = @py_string
95
- @py_string = nil
96
- py_string
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 = grab_py_string! || grab_rows!
101
+ @step_statement.multiline_arg = grab_doc_string! || grab_rows!
102
102
  @formatter.step(@step_statement)
103
103
  @step_statement = nil
104
104
  end
@@ -1,4 +1,4 @@
1
- | | feature | background | scenario | scenario_outline | examples | step | row | py_string | eof | comment | tag |
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 |
@@ -1,4 +1,4 @@
1
- | | feature | background | scenario | scenario_outline | examples | step | row | py_string | eof | comment | tag |
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 | py_string | eof | comment | tag |
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 |