gherkin 5.1.0 → 6.0.10

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -4
  3. data/bin/gherkin +43 -16
  4. data/gherkin-go/gherkin-go-darwin-386 +0 -0
  5. data/gherkin-go/gherkin-go-darwin-amd64 +0 -0
  6. data/gherkin-go/gherkin-go-freebsd-386 +0 -0
  7. data/gherkin-go/gherkin-go-freebsd-amd64 +0 -0
  8. data/gherkin-go/gherkin-go-freebsd-arm +0 -0
  9. data/gherkin-go/gherkin-go-linux-386 +0 -0
  10. data/gherkin-go/gherkin-go-linux-amd64 +0 -0
  11. data/gherkin-go/gherkin-go-linux-arm +0 -0
  12. data/gherkin-go/gherkin-go-linux-mips +2 -0
  13. data/gherkin-go/gherkin-go-linux-mips64 +2 -0
  14. data/gherkin-go/gherkin-go-linux-mips64le +2 -0
  15. data/gherkin-go/gherkin-go-linux-mipsle +2 -0
  16. data/gherkin-go/gherkin-go-linux-s390x +2 -0
  17. data/gherkin-go/gherkin-go-netbsd-386 +0 -0
  18. data/gherkin-go/gherkin-go-netbsd-amd64 +0 -0
  19. data/gherkin-go/gherkin-go-netbsd-arm +0 -0
  20. data/gherkin-go/gherkin-go-openbsd-386 +0 -0
  21. data/gherkin-go/gherkin-go-openbsd-amd64 +0 -0
  22. data/gherkin-go/gherkin-go-windows-386.exe +0 -0
  23. data/gherkin-go/gherkin-go-windows-amd64.exe +0 -0
  24. data/lib/gherkin/dialect.rb +16 -2
  25. data/lib/gherkin/exe_file_path.rb +3 -0
  26. data/lib/gherkin/gherkin.rb +75 -0
  27. data/lib/gherkin/protobuf_cucumber_messages.rb +30 -0
  28. data/spec/capture_warnings.rb +11 -5
  29. data/spec/coverage.rb +3 -6
  30. data/spec/gherkin/dialect_spec.rb +13 -0
  31. data/spec/gherkin/gherkin_spec.rb +354 -0
  32. metadata +49 -27
  33. data/lib/gherkin/ast_builder.rb +0 -257
  34. data/lib/gherkin/ast_node.rb +0 -30
  35. data/lib/gherkin/errors.rb +0 -45
  36. data/lib/gherkin/gherkin-languages.json +0 -3239
  37. data/lib/gherkin/gherkin_line.rb +0 -95
  38. data/lib/gherkin/parser.rb +0 -2310
  39. data/lib/gherkin/pickles/compiler.rb +0 -163
  40. data/lib/gherkin/stream/gherkin_events.rb +0 -71
  41. data/lib/gherkin/stream/source_events.rb +0 -26
  42. data/lib/gherkin/token.rb +0 -18
  43. data/lib/gherkin/token_formatter_builder.rb +0 -39
  44. data/lib/gherkin/token_matcher.rb +0 -169
  45. data/lib/gherkin/token_scanner.rb +0 -40
  46. data/spec/gherkin/parser_spec.rb +0 -280
  47. data/spec/gherkin/stream/gherkin_events_spec.rb +0 -27
  48. data/spec/gherkin/stream/test_fr.feature +0 -3
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gherkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 6.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gáspár Nagy
@@ -10,22 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-05-30 00:00:00.000000000 Z
13
+ date: 2018-09-23 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: cucumber-messages
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - '='
27
+ - !ruby/object:Gem::Version
28
+ version: 1.0.0
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: bundler
17
31
  requirement: !ruby/object:Gem::Requirement
18
32
  requirements:
19
- - - ">="
33
+ - - "~>"
20
34
  - !ruby/object:Gem::Version
21
- version: '0'
35
+ version: '1.16'
22
36
  type: :development
23
37
  prerelease: false
24
38
  version_requirements: !ruby/object:Gem::Requirement
25
39
  requirements:
26
- - - ">="
40
+ - - "~>"
27
41
  - !ruby/object:Gem::Version
28
- version: '0'
42
+ version: '1.16'
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: rake
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -80,25 +94,34 @@ files:
80
94
  - README.md
81
95
  - bin/gherkin
82
96
  - bin/gherkin-ruby
83
- - lib/gherkin/ast_builder.rb
84
- - lib/gherkin/ast_node.rb
97
+ - gherkin-go/gherkin-go-darwin-386
98
+ - gherkin-go/gherkin-go-darwin-amd64
99
+ - gherkin-go/gherkin-go-freebsd-386
100
+ - gherkin-go/gherkin-go-freebsd-amd64
101
+ - gherkin-go/gherkin-go-freebsd-arm
102
+ - gherkin-go/gherkin-go-linux-386
103
+ - gherkin-go/gherkin-go-linux-amd64
104
+ - gherkin-go/gherkin-go-linux-arm
105
+ - gherkin-go/gherkin-go-linux-mips
106
+ - gherkin-go/gherkin-go-linux-mips64
107
+ - gherkin-go/gherkin-go-linux-mips64le
108
+ - gherkin-go/gherkin-go-linux-mipsle
109
+ - gherkin-go/gherkin-go-linux-s390x
110
+ - gherkin-go/gherkin-go-netbsd-386
111
+ - gherkin-go/gherkin-go-netbsd-amd64
112
+ - gherkin-go/gherkin-go-netbsd-arm
113
+ - gherkin-go/gherkin-go-openbsd-386
114
+ - gherkin-go/gherkin-go-openbsd-amd64
115
+ - gherkin-go/gherkin-go-windows-386.exe
116
+ - gherkin-go/gherkin-go-windows-amd64.exe
85
117
  - lib/gherkin/dialect.rb
86
- - lib/gherkin/errors.rb
87
- - lib/gherkin/gherkin-languages.json
88
- - lib/gherkin/gherkin_line.rb
89
- - lib/gherkin/parser.rb
90
- - lib/gherkin/pickles/compiler.rb
91
- - lib/gherkin/stream/gherkin_events.rb
92
- - lib/gherkin/stream/source_events.rb
93
- - lib/gherkin/token.rb
94
- - lib/gherkin/token_formatter_builder.rb
95
- - lib/gherkin/token_matcher.rb
96
- - lib/gherkin/token_scanner.rb
118
+ - lib/gherkin/exe_file_path.rb
119
+ - lib/gherkin/gherkin.rb
120
+ - lib/gherkin/protobuf_cucumber_messages.rb
97
121
  - spec/capture_warnings.rb
98
122
  - spec/coverage.rb
99
- - spec/gherkin/parser_spec.rb
100
- - spec/gherkin/stream/gherkin_events_spec.rb
101
- - spec/gherkin/stream/test_fr.feature
123
+ - spec/gherkin/dialect_spec.rb
124
+ - spec/gherkin/gherkin_spec.rb
102
125
  homepage: https://github.com/cucumber/gherkin-ruby
103
126
  licenses:
104
127
  - MIT
@@ -120,13 +143,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
143
  version: '0'
121
144
  requirements: []
122
145
  rubyforge_project:
123
- rubygems_version: 2.7.6
146
+ rubygems_version: 2.7.7
124
147
  signing_key:
125
148
  specification_version: 4
126
- summary: gherkin-5.1.0
149
+ summary: gherkin-6.0.10
127
150
  test_files:
128
- - spec/gherkin/stream/test_fr.feature
129
- - spec/gherkin/stream/gherkin_events_spec.rb
130
- - spec/gherkin/parser_spec.rb
131
151
  - spec/capture_warnings.rb
132
152
  - spec/coverage.rb
153
+ - spec/gherkin/dialect_spec.rb
154
+ - spec/gherkin/gherkin_spec.rb
@@ -1,257 +0,0 @@
1
- require 'gherkin/ast_node'
2
-
3
- module Gherkin
4
- class AstBuilder
5
- def initialize
6
- reset
7
- end
8
-
9
- def reset
10
- @stack = [AstNode.new(:None)]
11
- @comments = []
12
- end
13
-
14
- def start_rule(rule_type)
15
- @stack.push AstNode.new(rule_type)
16
- end
17
-
18
- def end_rule(rule_type)
19
- node = @stack.pop
20
- current_node.add(node.rule_type, transform_node(node))
21
- end
22
-
23
- def build(token)
24
- if token.matched_type == :Comment
25
- @comments.push({
26
- type: :Comment,
27
- location: get_location(token),
28
- text: token.matched_text
29
- })
30
- else
31
- current_node.add(token.matched_type, token)
32
- end
33
- end
34
-
35
- def get_result
36
- current_node.get_single(:GherkinDocument)
37
- end
38
-
39
- def current_node
40
- @stack.last
41
- end
42
-
43
- def get_location(token, column=nil)
44
- # TODO: translated from JS... is it right?
45
- (column.nil? || column.zero?) ? token.location : {line: token.location[:line], column: column}
46
- end
47
-
48
- def get_tags(node)
49
- tags = []
50
- tags_node = node.get_single(:Tags)
51
- return tags unless tags_node
52
-
53
- tags_node.get_tokens(:TagLine).each do |token|
54
- token.matched_items.each do |tag_item|
55
- tags.push({
56
- type: :Tag,
57
- location: get_location(token, tag_item.column),
58
- name: tag_item.text
59
- })
60
- end
61
- end
62
-
63
- tags
64
- end
65
-
66
- def get_table_rows(node)
67
- rows = node.get_tokens(:TableRow).map do |token|
68
- {
69
- type: :TableRow,
70
- location: get_location(token),
71
- cells: get_cells(token)
72
- }
73
- end
74
- ensure_cell_count(rows);
75
- rows
76
- end
77
-
78
- def ensure_cell_count(rows)
79
- return if rows.empty?
80
- cell_count = rows[0][:cells].length
81
- rows.each do |row|
82
- if (row[:cells].length != cell_count)
83
- raise AstBuilderException.new("inconsistent cell count within the table", row[:location]);
84
- end
85
- end
86
- end
87
-
88
- def get_cells(table_row_token)
89
- table_row_token.matched_items.map do |cell_item|
90
- {
91
- type: :TableCell,
92
- location: get_location(table_row_token, cell_item.column),
93
- value: cell_item.text
94
- }
95
- end
96
- end
97
-
98
- def get_description(node)
99
- node.get_single(:Description)
100
- end
101
-
102
- def get_steps(node)
103
- node.get_items(:Step)
104
- end
105
-
106
- def transform_node(node)
107
- case node.rule_type
108
- when :Step
109
- step_line = node.get_token(:StepLine)
110
- step_argument = node.get_single(:DataTable) || node.get_single(:DocString) || nil
111
-
112
- reject_nils(
113
- type: node.rule_type,
114
- location: get_location(step_line),
115
- keyword: step_line.matched_keyword,
116
- text: step_line.matched_text,
117
- argument: step_argument
118
- )
119
- when :DocString
120
- separator_token = node.get_tokens(:DocStringSeparator)[0]
121
- content_type = separator_token.matched_text == '' ? nil : separator_token.matched_text
122
- line_tokens = node.get_tokens(:Other)
123
- content = line_tokens.map { |t| t.matched_text }.join("\n")
124
-
125
- reject_nils(
126
- type: node.rule_type,
127
- location: get_location(separator_token),
128
- contentType: content_type,
129
- content: content
130
- )
131
- when :DataTable
132
- rows = get_table_rows(node)
133
- reject_nils(
134
- type: node.rule_type,
135
- location: rows[0][:location],
136
- rows: rows,
137
- )
138
- when :Background
139
- background_line = node.get_token(:BackgroundLine)
140
- description = get_description(node)
141
- steps = get_steps(node)
142
-
143
- reject_nils(
144
- type: node.rule_type,
145
- location: get_location(background_line),
146
- keyword: background_line.matched_keyword,
147
- name: background_line.matched_text,
148
- description: description,
149
- steps: steps
150
- )
151
- when :Scenario_Definition
152
- tags = get_tags(node)
153
- scenario_node = node.get_single(:Scenario)
154
- if(scenario_node)
155
- scenario_line = scenario_node.get_token(:ScenarioLine)
156
- description = get_description(scenario_node)
157
- steps = get_steps(scenario_node)
158
-
159
- reject_nils(
160
- type: scenario_node.rule_type,
161
- tags: tags,
162
- location: get_location(scenario_line),
163
- keyword: scenario_line.matched_keyword,
164
- name: scenario_line.matched_text,
165
- description: description,
166
- steps: steps
167
- )
168
- else
169
- scenario_outline_node = node.get_single(:ScenarioOutline)
170
- raise 'Internal grammar error' unless scenario_outline_node
171
-
172
- scenario_outline_line = scenario_outline_node.get_token(:ScenarioOutlineLine)
173
- description = get_description(scenario_outline_node)
174
- steps = get_steps(scenario_outline_node)
175
- examples = scenario_outline_node.get_items(:Examples_Definition)
176
-
177
- reject_nils(
178
- type: scenario_outline_node.rule_type,
179
- tags: tags,
180
- location: get_location(scenario_outline_line),
181
- keyword: scenario_outline_line.matched_keyword,
182
- name: scenario_outline_line.matched_text,
183
- description: description,
184
- steps: steps,
185
- examples: examples
186
- )
187
- end
188
- when :Examples_Definition
189
- tags = get_tags(node)
190
- examples_node = node.get_single(:Examples)
191
- examples_line = examples_node.get_token(:ExamplesLine)
192
- description = get_description(examples_node)
193
- examples_table = examples_node.get_single(:Examples_Table)
194
-
195
- reject_nils(
196
- type: examples_node.rule_type,
197
- tags: tags,
198
- location: get_location(examples_line),
199
- keyword: examples_line.matched_keyword,
200
- name: examples_line.matched_text,
201
- description: description,
202
- tableHeader: !examples_table.nil? ? examples_table[:tableHeader] : nil,
203
- tableBody: !examples_table.nil? ? examples_table[:tableBody] : nil
204
- )
205
- when :Examples_Table
206
- rows = get_table_rows(node)
207
-
208
- reject_nils(
209
- tableHeader: rows.first,
210
- tableBody: rows[1..-1]
211
- )
212
- when :Description
213
- line_tokens = node.get_tokens(:Other)
214
- # Trim trailing empty lines
215
- last_non_empty = line_tokens.rindex { |token| !token.line.trimmed_line_text.empty? }
216
- description = line_tokens[0..last_non_empty].map { |token| token.matched_text }.join("\n")
217
- return description
218
- when :Feature
219
- header = node.get_single(:Feature_Header)
220
- return unless header
221
- tags = get_tags(header)
222
- feature_line = header.get_token(:FeatureLine)
223
- return unless feature_line
224
- children = []
225
- background = node.get_single(:Background)
226
- children.push(background) if background
227
- children.concat(node.get_items(:Scenario_Definition))
228
- description = get_description(header)
229
- language = feature_line.matched_gherkin_dialect
230
-
231
- reject_nils(
232
- type: node.rule_type,
233
- tags: tags,
234
- location: get_location(feature_line),
235
- language: language,
236
- keyword: feature_line.matched_keyword,
237
- name: feature_line.matched_text,
238
- description: description,
239
- children: children,
240
- )
241
- when :GherkinDocument
242
- feature = node.get_single(:Feature)
243
- reject_nils(
244
- type: node.rule_type,
245
- feature: feature,
246
- comments: @comments
247
- )
248
- else
249
- return node
250
- end
251
- end
252
-
253
- def reject_nils(values)
254
- values.reject { |k,v| v.nil? }
255
- end
256
- end
257
- end
@@ -1,30 +0,0 @@
1
- module Gherkin
2
- class AstNode
3
- attr_reader :rule_type
4
-
5
- def initialize(rule_type)
6
- @rule_type = rule_type
7
- @_sub_items = Hash.new { |hash, key| hash[key] = [] } # returns [] for unknown key
8
- end
9
-
10
- def add(rule_type, obj)
11
- @_sub_items[rule_type].push(obj)
12
- end
13
-
14
- def get_single(rule_type)
15
- @_sub_items[rule_type].first
16
- end
17
-
18
- def get_items(rule_type)
19
- @_sub_items[rule_type]
20
- end
21
-
22
- def get_token(token_type)
23
- get_single(token_type)
24
- end
25
-
26
- def get_tokens(token_type)
27
- @_sub_items[token_type]
28
- end
29
- end
30
- end
@@ -1,45 +0,0 @@
1
- module Gherkin
2
- class ParserError < StandardError; end
3
-
4
- class ParserException < ParserError
5
- attr_reader :location
6
-
7
- def initialize(message, location)
8
- @location = location
9
- super("(#{location[:line]}:#{location[:column] || 0}): #{message}")
10
- end
11
- end
12
-
13
- class NoSuchLanguageException < ParserException
14
- def initialize(language, location)
15
- super "Language not supported: #{language}", location
16
- end
17
- end
18
-
19
- class AstBuilderException < ParserException; end
20
-
21
- class CompositeParserException < ParserError
22
- attr_reader :errors
23
-
24
- def initialize(errors)
25
- @errors = errors
26
- super "Parser errors:\n" + errors.map(&:message).join("\n")
27
- end
28
- end
29
-
30
- class UnexpectedTokenException < ParserException
31
- def initialize(received_token, expected_token_types, state_comment)
32
- message = "expected: #{expected_token_types.join(", ")}, got '#{received_token.token_value.strip}'"
33
- column = received_token.location[:column]
34
- location = (column.nil? || column.zero?) ? {line: received_token.location[:line], column: received_token.line.indent + 1} : received_token.location
35
- super(message, location)
36
- end
37
- end
38
-
39
- class UnexpectedEOFException < ParserException
40
- def initialize(received_token, expected_token_types, state_comment)
41
- message = "unexpected end of file, expected: #{expected_token_types.join(", ")}"
42
- super(message, received_token.location)
43
- end
44
- end
45
- end