cuke_modeler 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +16 -0
  3. data/Gemfile +11 -3
  4. data/History.md +5 -0
  5. data/LICENSE.txt +1 -1
  6. data/Rakefile +8 -1
  7. data/appveyor.yml +7 -12
  8. data/cuke_modeler.gemspec +2 -2
  9. data/lib/cuke_modeler/adapters/gherkin_6_adapter.rb +309 -0
  10. data/lib/cuke_modeler/parsing.rb +28 -5
  11. data/lib/cuke_modeler/version.rb +1 -1
  12. data/testing/cucumber/step_definitions/feature_file_steps.rb +1 -1
  13. data/testing/cucumber/step_definitions/modeling_steps.rb +2 -2
  14. data/testing/cucumber/step_definitions/verification_steps.rb +3 -2
  15. data/testing/file_helper.rb +3 -0
  16. data/testing/gemfiles/gherkin2.gemfile +7 -0
  17. data/testing/gemfiles/gherkin3.gemfile +6 -0
  18. data/testing/gemfiles/gherkin4.gemfile +7 -0
  19. data/testing/gemfiles/gherkin5.gemfile +6 -0
  20. data/testing/gemfiles/gherkin6.gemfile +10 -0
  21. data/testing/rspec/spec/integration/background_integration_spec.rb +80 -72
  22. data/testing/rspec/spec/integration/cell_integration_spec.rb +28 -20
  23. data/testing/rspec/spec/integration/comment_integration_spec.rb +11 -3
  24. data/testing/rspec/spec/integration/directory_integration_spec.rb +2 -2
  25. data/testing/rspec/spec/integration/doc_string_integration_spec.rb +26 -18
  26. data/testing/rspec/spec/integration/example_integration_spec.rb +75 -61
  27. data/testing/rspec/spec/integration/feature_file_integration_spec.rb +30 -20
  28. data/testing/rspec/spec/integration/feature_integration_spec.rb +106 -98
  29. data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +11 -11
  30. data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +11 -11
  31. data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +12 -12
  32. data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +166 -0
  33. data/testing/rspec/spec/integration/outline_integration_spec.rb +116 -102
  34. data/testing/rspec/spec/integration/parsing_integration_spec.rb +16 -4
  35. data/testing/rspec/spec/integration/row_integration_spec.rb +26 -18
  36. data/testing/rspec/spec/integration/scenario_integration_spec.rb +82 -74
  37. data/testing/rspec/spec/integration/step_integration_spec.rb +65 -49
  38. data/testing/rspec/spec/integration/table_integration_spec.rb +25 -17
  39. data/testing/rspec/spec/integration/tag_integration_spec.rb +27 -19
  40. data/testing/rspec/spec/spec_helper.rb +64 -35
  41. data/todo.txt +3 -1
  42. metadata +10 -8
  43. data/testing/cucumber/support/transforms.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6f6ce507c3e4cce81b178759608f8421995acb33
4
- data.tar.gz: 28e38d785382112db34e4bd8ad21c2ab2d520fb2
2
+ SHA256:
3
+ metadata.gz: 76a8b71aee8bdbf79c8cf429c31fc694edaa85514a5ca5620952b033e8f237cb
4
+ data.tar.gz: 2a935d1f999d3b0a31a0a72c6b2dd2c4f419a5c79bcbe8bb88e012280bcee06b
5
5
  SHA512:
6
- metadata.gz: 6468b515b7f55540cf96319c3862ef04d7560b583294a694c71a3077becc915516465dec013e414c24d05b6fe8cfa0ef37844b4eab23dc1f62068b876b0fa17c
7
- data.tar.gz: c636a5d624e5ad31be581134f0429bf63cd2d52bbef6a0278c5484ac8a2d0e18519e0d372051d5de44f4a012959dd7d93801559eda4f693e44247b779dd0c210
6
+ metadata.gz: 9608da985b4103317a66f4490a32925ec48a084cee57ecb273e4536b5d1fb30564edc0355917f30e9c98e1f2da7531f28242874f85207aeb7f25d5a0835406ee
7
+ data.tar.gz: 769dbd96bb7c6f079166747666e6a5307e69949e5a9bc3af0d562c1ddac44873bda92a935b32bd3dec3f16bf66c6aaab093eace3534bbab7c30ce15caf1d4cc5
@@ -15,6 +15,7 @@ gemfile:
15
15
  - testing/gemfiles/gherkin3.gemfile
16
16
  - testing/gemfiles/gherkin4.gemfile
17
17
  - testing/gemfiles/gherkin5.gemfile
18
+ - testing/gemfiles/gherkin6.gemfile
18
19
 
19
20
  matrix:
20
21
  exclude:
@@ -27,9 +28,24 @@ matrix:
27
28
  # gherkin 5.x does not work with Ruby 1.8.x
28
29
  - rvm: 1.8.7
29
30
  gemfile: testing/gemfiles/gherkin5.gemfile
31
+ # gherkin 6.x does not work with Ruby 1.8.x
32
+ - rvm: 1.8.7
33
+ gemfile: testing/gemfiles/gherkin6.gemfile
34
+ # gherkin 6.x does not work with Ruby 1.9.x
35
+ - rvm: 1.9.3
36
+ gemfile: testing/gemfiles/gherkin6.gemfile
37
+
38
+ # TODO: turn this back on
39
+ # gherkin 6.x relies on 'google-protobuf', which does not currently work on JRuby (https://github.com/protocolbuffers/protobuf/issues/1594)
40
+ - rvm: jruby-9.1.7.0
41
+ gemfile: testing/gemfiles/gherkin6.gemfile
42
+
30
43
  # Travis does not provide 1.8.7 on OSX
31
44
  - rvm: 1.8.7
32
45
  os: osx
46
+ # Travis does not provide 1.9.3 on OSX
47
+ - rvm: 1.9.3
48
+ os: osx
33
49
 
34
50
  # todo - Remove this once TravisCI fixes their bundler issue (https://github.com/alphagov/govuk_template/pull/186)
35
51
  before_install:
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source 'http://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in cuke_modeler.gemspec
4
4
  gemspec
@@ -7,6 +7,11 @@ gemspec
7
7
 
8
8
  if RUBY_VERSION =~ /^1\./
9
9
 
10
+ if RbConfig::CONFIG['host_os'].downcase =~ /mswin|msys|mingw32/
11
+ gem 'ffi', '< 1.9.15' # The 'ffi' gem, for Windows, requires Ruby 2.x on/after this version
12
+ end
13
+
14
+ gem 'unf_ext', '< 0.0.7.3' # Requires Ruby 2.x on/after this version
10
15
  gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
11
16
  gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
12
17
  gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
@@ -15,6 +20,9 @@ if RUBY_VERSION =~ /^1\./
15
20
  gem 'cucumber', '~> 1.0' # Ruby 1.8.x support dropped after this version
16
21
  gem 'gherkin', '< 2.12.1' # Ruby 1.8.x support dropped after this version
17
22
  gem 'rake', '< 11.0' # Ruby 1.8.x support dropped after this version
23
+ else
24
+ gem 'rake', '< 12.3.0' # Ruby 1.9.x support dropped after this version
25
+ gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
18
26
  end
19
27
 
20
28
  elsif RUBY_VERSION =~ /^2\./
@@ -23,6 +31,6 @@ elsif RUBY_VERSION =~ /^2\./
23
31
  gem 'test-unit'
24
32
  end
25
33
 
26
- gem 'gherkin', '~> 5.0'
27
-
34
+ gem 'gherkin', '~> 6.0'
35
+ gem 'cucumber', '~>4.0.rc'
28
36
  end
data/History.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### Version 1.4.0 / 2018-11-14
2
+
3
+ * Now compatible with Gherkin 6.x.
4
+
5
+
1
6
  ### Version 1.3.0 / 2017-10-19
2
7
 
3
8
  * Now compatible with Gherkin 5.x.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2017 Eric Kessler, et al
1
+ Copyright (c) 2014-2018 Eric Kessler, et al
2
2
 
3
3
  MIT License
4
4
 
data/Rakefile CHANGED
@@ -26,7 +26,14 @@ namespace 'cuke_modeler' do
26
26
  desc 'Test gem based on Ruby/dependency versions'
27
27
  task :smart_test do |t, args|
28
28
  rspec_args = '--tag ~@wip --pattern testing/rspec/spec/**/*_spec.rb'
29
- cucumber_args = 'testing/cucumber/features -r testing/cucumber/support -r testing/cucumber/step_definitions -f progress -t ~@wip'
29
+
30
+ cucumber_version = Gem.loaded_specs['cucumber'].version.version
31
+
32
+ if cucumber_version =~ /^[123]\./
33
+ cucumber_args = 'testing/cucumber/features -r testing/cucumber/support -r testing/cucumber/step_definitions -f progress -t ~@wip'
34
+ else
35
+ cucumber_args = "testing/cucumber/features -r testing/cucumber/support -r testing/cucumber/step_definitions -f progress -t 'not @wip'"
36
+ end
30
37
 
31
38
  Rake::Task['cuke_modeler:test_everything'].invoke(rspec_args, cucumber_args)
32
39
  end
@@ -2,37 +2,32 @@ version: '1.0.{build}'
2
2
 
3
3
  environment:
4
4
  matrix:
5
- - RUBY_VERSION: 193
6
- BUNDLE_GEMFILE: testing/gemfiles/gherkin2.gemfile
7
- # AppVeyor does not have a 64-bit Ruby 1.9.3
5
+
8
6
  # Gherkin 2.x does not appear to support 32-bit Ruby 2.x and it's not worth it to investigate if this is true or not
9
7
  - RUBY_VERSION: 23-x64
10
8
  BUNDLE_GEMFILE: testing/gemfiles/gherkin2.gemfile
11
9
 
12
- - RUBY_VERSION: 193
13
- BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
14
- # AppVeyor does not have a 64-bit Ruby 1.9.3
15
10
  - RUBY_VERSION: 23
16
11
  BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
17
12
  - RUBY_VERSION: 23-x64
18
13
  BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
19
14
 
20
- - RUBY_VERSION: 193
21
- BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
22
- # AppVeyor does not have a 64-bit Ruby 1.9.3
23
15
  - RUBY_VERSION: 23
24
16
  BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
25
17
  - RUBY_VERSION: 23-x64
26
18
  BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
27
19
 
28
- - RUBY_VERSION: 193
29
- BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
30
- # AppVeyor does not have a 64-bit Ruby 1.9.3
31
20
  - RUBY_VERSION: 23
32
21
  BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
33
22
  - RUBY_VERSION: 23-x64
34
23
  BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
35
24
 
25
+ # Gherkin 6.x requires at least Ruby 2.2
26
+ - RUBY_VERSION: 23
27
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
28
+ - RUBY_VERSION: 23-x64
29
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
30
+
36
31
  install:
37
32
  - set PATH=C:\Ruby%RUBY_VERSION%\bin;%PATH%
38
33
  - bundle install
@@ -18,13 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency 'gherkin', '< 6.0'
21
+ spec.add_runtime_dependency 'gherkin', '< 7.0'
22
22
  spec.add_runtime_dependency('json', '>= 1.0', '< 3.0')
23
23
  spec.add_runtime_dependency('multi_json', '~> 1.0')
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.5"
26
26
  spec.add_development_dependency "rake", '< 13.0.0'
27
- spec.add_development_dependency 'cucumber', '< 3.0.0'
27
+ spec.add_development_dependency 'cucumber', '< 5.0.0'
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
29
  spec.add_development_dependency 'simplecov', '< 1.0.0'
30
30
  spec.add_development_dependency 'racatt', '~> 1.0'
@@ -0,0 +1,309 @@
1
+ module CukeModeler
2
+
3
+ # An adapter that can convert the output of version 6.x of the *gherkin* gem into input that is consumable by this gem.
4
+
5
+ class Gherkin6Adapter
6
+
7
+ # Adapts the given AST into the shape that this gem expects
8
+ def adapt(parsed_ast)
9
+ # Saving off the original data
10
+ parsed_ast['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_ast))
11
+
12
+ # Removing parsed data for child elements in order to avoid duplicating data
13
+ parsed_ast['cuke_modeler_parsing_data'][:feature] = nil
14
+ parsed_ast['cuke_modeler_parsing_data'][:comments] = nil
15
+
16
+ # Comments are stored on the feature file in gherkin 4.x
17
+ parsed_ast['comments'] = []
18
+ parsed_ast[:comments].each do |comment|
19
+ adapt_comment!(comment)
20
+ end
21
+ parsed_ast['comments'].concat(parsed_ast.delete(:comments))
22
+
23
+ adapt_feature!(parsed_ast[:feature]) if parsed_ast[:feature]
24
+ parsed_ast['feature'] = parsed_ast.delete(:feature)
25
+
26
+ [parsed_ast]
27
+ end
28
+
29
+ # Adapts the AST sub-tree that is rooted at the given feature node.
30
+ def adapt_feature!(parsed_feature)
31
+ # Saving off the original data
32
+ parsed_feature['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_feature))
33
+
34
+ # Removing parsed data for child elements in order to avoid duplicating data
35
+ parsed_feature['cuke_modeler_parsing_data'][:tags] = nil
36
+ parsed_feature['cuke_modeler_parsing_data'][:children] = nil
37
+
38
+ parsed_feature['keyword'] = parsed_feature.delete(:keyword)
39
+ parsed_feature['name'] = parsed_feature.delete(:name)
40
+ parsed_feature['description'] = parsed_feature.delete(:description)
41
+ parsed_feature['line'] = parsed_feature.delete(:location)[:line]
42
+
43
+ parsed_feature['elements'] = []
44
+ adapt_child_elements!(parsed_feature[:children])
45
+ parsed_feature['elements'].concat(parsed_feature.delete(:children))
46
+
47
+ parsed_feature['tags'] = []
48
+ parsed_feature[:tags].each do |tag|
49
+ adapt_tag!(tag)
50
+ end
51
+ parsed_feature['tags'].concat(parsed_feature.delete(:tags))
52
+ end
53
+
54
+ # Adapts the AST sub-tree that is rooted at the given background node.
55
+ def adapt_background!(parsed_background)
56
+ # Saving off the original data
57
+ parsed_background['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_background))
58
+
59
+ # Removing parsed data for child elements in order to avoid duplicating data
60
+ parsed_background['cuke_modeler_parsing_data'][:background][:steps] = nil
61
+
62
+ parsed_background['type'] = 'Background'
63
+ parsed_background['keyword'] = parsed_background[:background].delete(:keyword)
64
+ parsed_background['name'] = parsed_background[:background].delete(:name)
65
+ parsed_background['description'] = parsed_background[:background].delete(:description)
66
+ parsed_background['line'] = parsed_background[:background].delete(:location)[:line]
67
+
68
+ parsed_background['steps'] = []
69
+ parsed_background[:background][:steps].each do |step|
70
+ adapt_step!(step)
71
+ end
72
+ parsed_background['steps'].concat(parsed_background[:background].delete(:steps))
73
+ end
74
+
75
+ # Adapts the AST sub-tree that is rooted at the given scenario node.
76
+ def adapt_scenario!(parsed_test)
77
+ # Removing parsed data for child elements in order to avoid duplicating data
78
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:tags] = nil
79
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:steps] = nil
80
+
81
+ parsed_test['type'] = 'Scenario'
82
+ parsed_test['keyword'] = parsed_test[:scenario].delete(:keyword)
83
+ parsed_test['name'] = parsed_test[:scenario].delete(:name)
84
+ parsed_test['description'] = parsed_test[:scenario].delete(:description)
85
+ parsed_test['line'] = parsed_test[:scenario].delete(:location)[:line]
86
+
87
+ parsed_test['tags'] = []
88
+ parsed_test[:scenario][:tags].each do |tag|
89
+ adapt_tag!(tag)
90
+ end
91
+ parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
92
+
93
+ parsed_test['steps'] = []
94
+ parsed_test[:scenario][:steps].each do |step|
95
+ adapt_step!(step)
96
+ end
97
+ parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
98
+ end
99
+
100
+ # Adapts the AST sub-tree that is rooted at the given outline node.
101
+ def adapt_outline!(parsed_test)
102
+ # Removing parsed data for child elements in order to avoid duplicating data
103
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:tags] = nil
104
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:steps] = nil
105
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:examples] = nil
106
+
107
+ parsed_test['type'] = 'ScenarioOutline'
108
+ parsed_test['keyword'] = parsed_test[:scenario].delete(:keyword)
109
+ parsed_test['name'] = parsed_test[:scenario].delete(:name)
110
+ parsed_test['description'] = parsed_test[:scenario].delete(:description)
111
+ parsed_test['line'] = parsed_test[:scenario].delete(:location)[:line]
112
+
113
+ parsed_test['tags'] = []
114
+ parsed_test[:scenario][:tags].each do |tag|
115
+ adapt_tag!(tag)
116
+ end
117
+ parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
118
+
119
+ parsed_test['steps'] = []
120
+ parsed_test[:scenario][:steps].each do |step|
121
+ adapt_step!(step)
122
+ end
123
+ parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
124
+
125
+ parsed_test['examples'] = []
126
+ parsed_test[:scenario][:examples].each do |step|
127
+ adapt_example!(step)
128
+ end
129
+ parsed_test['examples'].concat(parsed_test[:scenario].delete(:examples))
130
+ end
131
+
132
+ # Adapts the AST sub-tree that is rooted at the given example node.
133
+ def adapt_example!(parsed_example)
134
+ # Saving off the original data
135
+ parsed_example['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_example))
136
+
137
+ # Removing parsed data for child elements in order to avoid duplicating data
138
+ parsed_example['cuke_modeler_parsing_data'][:tags] = nil
139
+ parsed_example['cuke_modeler_parsing_data'][:table_header] = nil
140
+ parsed_example['cuke_modeler_parsing_data'][:table_body] = nil
141
+
142
+ parsed_example['keyword'] = parsed_example.delete(:keyword)
143
+ parsed_example['name'] = parsed_example.delete(:name)
144
+ parsed_example['line'] = parsed_example.delete(:location)[:line]
145
+ parsed_example['description'] = parsed_example.delete(:description)
146
+
147
+ parsed_example['rows'] = []
148
+
149
+ if parsed_example[:table_header]
150
+ adapt_table_row!(parsed_example[:table_header])
151
+ parsed_example['rows'] << parsed_example.delete(:table_header)
152
+ end
153
+
154
+ if parsed_example[:table_body]
155
+
156
+ parsed_example[:table_body].each do |row|
157
+ adapt_table_row!(row)
158
+ end
159
+ parsed_example['rows'].concat(parsed_example.delete(:table_body))
160
+ end
161
+
162
+
163
+ parsed_example['tags'] = []
164
+ parsed_example[:tags].each do |tag|
165
+ adapt_tag!(tag)
166
+ end
167
+ parsed_example['tags'].concat(parsed_example.delete(:tags))
168
+ end
169
+
170
+ # Adapts the AST sub-tree that is rooted at the given tag node.
171
+ def adapt_tag!(parsed_tag)
172
+ # Saving off the original data
173
+ parsed_tag['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_tag))
174
+
175
+ parsed_tag['name'] = parsed_tag.delete(:name)
176
+ parsed_tag['line'] = parsed_tag.delete(:location)[:line]
177
+ end
178
+
179
+ # Adapts the AST sub-tree that is rooted at the given comment node.
180
+ def adapt_comment!(parsed_comment)
181
+ # Saving off the original data
182
+ parsed_comment['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_comment))
183
+
184
+ parsed_comment['text'] = parsed_comment.delete(:text)
185
+ parsed_comment['line'] = parsed_comment.delete(:location)[:line]
186
+ end
187
+
188
+ # Adapts the AST sub-tree that is rooted at the given step node.
189
+ def adapt_step!(parsed_step)
190
+ # Saving off the original data
191
+ parsed_step['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step))
192
+
193
+ # Removing parsed data for child elements in order to avoid duplicating data
194
+ parsed_step['cuke_modeler_parsing_data'][:data_table] = nil
195
+ parsed_step['cuke_modeler_parsing_data'][:doc_string] = nil
196
+
197
+ parsed_step['keyword'] = parsed_step.delete(:keyword)
198
+ parsed_step['name'] = parsed_step.delete(:text)
199
+ parsed_step['line'] = parsed_step.delete(:location)[:line]
200
+
201
+
202
+ case
203
+ when parsed_step[:doc_string]
204
+ adapt_doc_string!(parsed_step[:doc_string])
205
+ parsed_step['doc_string'] = parsed_step.delete(:doc_string)
206
+ when parsed_step[:data_table]
207
+ adapt_step_table!(parsed_step[:data_table])
208
+ parsed_step['table'] = parsed_step.delete(:data_table)
209
+ else
210
+ # Step has no extra argument
211
+ end
212
+ end
213
+
214
+ # Adapts the AST sub-tree that is rooted at the given doc string node.
215
+ def adapt_doc_string!(parsed_doc_string)
216
+ # Saving off the original data
217
+ parsed_doc_string['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_doc_string))
218
+
219
+ parsed_doc_string['value'] = parsed_doc_string.delete(:content)
220
+ parsed_doc_string['content_type'] = parsed_doc_string.delete(:content_type).strip # TODO: fix bug in Gherkin so that this whitespace is already trimmed off
221
+ parsed_doc_string['line'] = parsed_doc_string.delete(:location)[:line]
222
+ end
223
+
224
+ # Adapts the AST sub-tree that is rooted at the given table node.
225
+ def adapt_step_table!(parsed_step_table)
226
+ # Saving off the original data
227
+ parsed_step_table['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step_table))
228
+
229
+ # Removing parsed data for child elements in order to avoid duplicating data
230
+ parsed_step_table['cuke_modeler_parsing_data'][:rows] = nil
231
+
232
+ parsed_step_table['rows'] = []
233
+ parsed_step_table[:rows].each do |row|
234
+ adapt_table_row!(row)
235
+ end
236
+ parsed_step_table['rows'].concat(parsed_step_table.delete(:rows))
237
+ parsed_step_table['line'] = parsed_step_table.delete(:location)[:line]
238
+ end
239
+
240
+ # Adapts the AST sub-tree that is rooted at the given row node.
241
+ def adapt_table_row!(parsed_table_row)
242
+ # Saving off the original data
243
+ parsed_table_row['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_table_row))
244
+
245
+ # Removing parsed data for child elements in order to avoid duplicating data which the child elements will themselves include
246
+ parsed_table_row['cuke_modeler_parsing_data'][:cells] = nil
247
+
248
+
249
+ parsed_table_row['line'] = parsed_table_row.delete(:location)[:line]
250
+
251
+ parsed_table_row['cells'] = []
252
+ parsed_table_row[:cells].each do |row|
253
+ adapt_table_cell!(row)
254
+ end
255
+ parsed_table_row['cells'].concat(parsed_table_row.delete(:cells))
256
+ end
257
+
258
+ # Adapts the AST sub-tree that is rooted at the given cell node.
259
+ def adapt_table_cell!(parsed_cell)
260
+ # Saving off the original data
261
+ parsed_cell['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_cell))
262
+
263
+ parsed_cell['value'] = parsed_cell.delete(:value)
264
+ parsed_cell['line'] = parsed_cell.delete(:location)[:line]
265
+ end
266
+
267
+
268
+ private
269
+
270
+
271
+ def adapt_child_elements!(parsed_children)
272
+ return if parsed_children.empty?
273
+
274
+ background_child = parsed_children.find { |child| child[:background] }
275
+
276
+ if background_child
277
+ adapt_background!(background_child)
278
+
279
+ remaining_children = parsed_children.reject { |child| child[:background] }
280
+ end
281
+
282
+ adapt_tests!(remaining_children || parsed_children)
283
+ end
284
+
285
+ def adapt_tests!(parsed_tests)
286
+ return unless parsed_tests
287
+
288
+ parsed_tests.each do |test|
289
+ adapt_test!(test)
290
+ end
291
+ end
292
+
293
+ def adapt_test!(parsed_test)
294
+ # Saving off the original data
295
+ parsed_test['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_test))
296
+
297
+
298
+ case
299
+ when parsed_test[:scenario] && parsed_test[:scenario][:examples].any?
300
+ adapt_outline!(parsed_test)
301
+ when parsed_test[:scenario]
302
+ adapt_scenario!(parsed_test)
303
+ else
304
+ raise(ArgumentError, "Unknown test type with keys: #{parsed_test.keys}")
305
+ end
306
+ end
307
+
308
+ end
309
+ end