cuke_modeler 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +51 -33
  3. data/CHANGELOG.md +13 -2
  4. data/Gemfile +9 -2
  5. data/appveyor.yml +29 -2
  6. data/cuke_modeler.gemspec +1 -1
  7. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +1 -1
  8. data/lib/cuke_modeler/adapters/gherkin_5_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_7_adapter.rb +307 -0
  10. data/lib/cuke_modeler/adapters/gherkin_8_adapter.rb +12 -0
  11. data/lib/cuke_modeler/adapters/gherkin_9_adapter.rb +12 -0
  12. data/lib/cuke_modeler/parsing.rb +116 -108
  13. data/lib/cuke_modeler/version.rb +1 -1
  14. data/testing/gemfiles/gherkin7.gemfile +9 -0
  15. data/testing/gemfiles/gherkin8.gemfile +9 -0
  16. data/testing/gemfiles/gherkin9.gemfile +9 -0
  17. data/testing/helper_methods.rb +23 -0
  18. data/testing/rspec/spec/integration/adapters/gherkin_2_adapter_spec.rb +1 -1
  19. data/testing/rspec/spec/integration/adapters/gherkin_3_adapter_spec.rb +1 -1
  20. data/testing/rspec/spec/integration/adapters/gherkin_4_adapter_spec.rb +1 -1
  21. data/testing/rspec/spec/integration/adapters/gherkin_5_adapter_spec.rb +165 -0
  22. data/testing/rspec/spec/integration/adapters/gherkin_6_adapter_spec.rb +1 -8
  23. data/testing/rspec/spec/integration/adapters/gherkin_7_adapter_spec.rb +162 -0
  24. data/testing/rspec/spec/integration/adapters/gherkin_8_adapter_spec.rb +162 -0
  25. data/testing/rspec/spec/integration/adapters/gherkin_9_adapter_spec.rb +162 -0
  26. data/testing/rspec/spec/integration/models/background_integration_spec.rb +19 -23
  27. data/testing/rspec/spec/integration/models/cell_integration_spec.rb +27 -24
  28. data/testing/rspec/spec/integration/models/comment_integration_spec.rb +26 -23
  29. data/testing/rspec/spec/integration/models/doc_string_integration_spec.rb +19 -23
  30. data/testing/rspec/spec/integration/models/example_integration_spec.rb +50 -38
  31. data/testing/rspec/spec/integration/models/feature_file_integration_spec.rb +32 -28
  32. data/testing/rspec/spec/integration/models/feature_integration_spec.rb +28 -23
  33. data/testing/rspec/spec/integration/models/outline_integration_spec.rb +39 -44
  34. data/testing/rspec/spec/integration/models/row_integration_spec.rb +35 -23
  35. data/testing/rspec/spec/integration/models/scenario_integration_spec.rb +19 -23
  36. data/testing/rspec/spec/integration/models/step_integration_spec.rb +51 -47
  37. data/testing/rspec/spec/integration/models/table_integration_spec.rb +19 -23
  38. data/testing/rspec/spec/integration/models/tag_integration_spec.rb +35 -23
  39. data/testing/rspec/spec/integration/parsing_integration_spec.rb +27 -6
  40. data/testing/rspec/spec/spec_helper.rb +39 -46
  41. metadata +16 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92ec631920bf8e2af7095588f0f85bf6f43e109737d39b7b2b92a5e71b00bd82
4
- data.tar.gz: c8d6abcdf38a6d71a9281c841a60feb0cf839bfa4c13430009ab56458b7d7ac2
3
+ metadata.gz: 1e45af46cbcc095433e4bf40fd868daed964bbbc53dac06d3d3de6ca6a4c2db1
4
+ data.tar.gz: 36e8660c3f4e993732113f79979168ac59b1bd33c35e8722fc06abdf4e54ce85
5
5
  SHA512:
6
- metadata.gz: a96083807968d997553eb00ab15f1432e89d96527a0d8a814902c1410a87ea11232ff9de904a063782f5efad3aa6a35c6d9ddbd169e3e2bf248cd11c0ccd6710
7
- data.tar.gz: 111e2d71eb17c5ac1cd4378bc92672eb76ac412dc6943fc29430eeb6aeacda2955f77171347e633e8fa71fef1a803913affb7a0994bb4e6fee6084e75bbdb760
6
+ metadata.gz: 39109727b23ffbed1015bc7d690367a10c8f8a88e12d099ba973fcd722cfc5fd0f15e9c5dfeef4a61793850b75a46feb9933f1bba66845cb7ccd72c323d26c36
7
+ data.tar.gz: 11848c5307c7da2a0669e80dfef83cf535ba1259e3c04d05897b12ab5057760419f239ff7eaaebbc37fec33e7610cc11c771f81128d05f7a779794ad70770978
@@ -21,43 +21,61 @@ gemfile:
21
21
  - testing/gemfiles/gherkin4.gemfile
22
22
  - testing/gemfiles/gherkin5.gemfile
23
23
  - testing/gemfiles/gherkin6.gemfile
24
+ - testing/gemfiles/gherkin7.gemfile
25
+ - testing/gemfiles/gherkin8.gemfile
26
+ - testing/gemfiles/gherkin9.gemfile
24
27
 
25
28
  matrix:
26
29
  exclude:
27
- # gherkin 3.x does not work with Ruby 1.8.x
28
- - rvm: 1.8.7
29
- gemfile: testing/gemfiles/gherkin3.gemfile
30
- # gherkin 4.x does not work with Ruby 1.8.x
31
- - rvm: 1.8.7
32
- gemfile: testing/gemfiles/gherkin4.gemfile
33
- # gherkin 5.x does not work with Ruby 1.8.x
34
- - rvm: 1.8.7
35
- gemfile: testing/gemfiles/gherkin5.gemfile
36
- # gherkin 6.x does not work with Ruby 1.8.x
37
- - rvm: 1.8.7
38
- gemfile: testing/gemfiles/gherkin6.gemfile
39
- # gherkin 6.x does not work with Ruby 1.9.x
40
- - rvm: 1.9.3
41
- gemfile: testing/gemfiles/gherkin6.gemfile
42
-
43
- # TODO: use once protobuf is updated
44
- # gherkin 6.x uses protobuf, which does not work with Ruby 2.6.x
45
- - rvm: 2.6.0
46
- gemfile: testing/gemfiles/gherkin6.gemfile
47
-
48
- # TODO: turn this back on
49
- # gherkin 6.x relies on 'google-protobuf', which does not currently work on JRuby (https://github.com/protocolbuffers/protobuf/issues/1594)
50
- - rvm: jruby-9.1.7.0
51
- gemfile: testing/gemfiles/gherkin6.gemfile
52
-
53
- # Travis does not provide 1.8.7 on OSX
54
- - rvm: 1.8.7
55
- os: osx
56
- # Travis does not provide 1.9.3 on OSX
57
- - rvm: 1.9.3
58
- os: osx
30
+
31
+ # gherkin 3.x+ does not work with Ruby 1.8.x
32
+ - rvm: 1.8.7
33
+ gemfile: testing/gemfiles/gherkin3.gemfile
34
+ - rvm: 1.8.7
35
+ gemfile: testing/gemfiles/gherkin4.gemfile
36
+ - rvm: 1.8.7
37
+ gemfile: testing/gemfiles/gherkin5.gemfile
38
+ - rvm: 1.8.7
39
+ gemfile: testing/gemfiles/gherkin6.gemfile
40
+ - rvm: 1.8.7
41
+ gemfile: testing/gemfiles/gherkin7.gemfile
42
+ - rvm: 1.8.7
43
+ gemfile: testing/gemfiles/gherkin8.gemfile
44
+ - rvm: 1.8.7
45
+ gemfile: testing/gemfiles/gherkin9.gemfile
46
+
47
+ # gherkin 6.x+ does not work with Ruby 1.9.x
48
+ - rvm: 1.9.3
49
+ gemfile: testing/gemfiles/gherkin6.gemfile
50
+ - rvm: 1.9.3
51
+ gemfile: testing/gemfiles/gherkin7.gemfile
52
+ - rvm: 1.9.3
53
+ gemfile: testing/gemfiles/gherkin8.gemfile
54
+ - rvm: 1.9.3
55
+ gemfile: testing/gemfiles/gherkin9.gemfile
56
+
57
+ # TODO: turn this back on
58
+ # gherkin 6.x+ relies on 'google-protobuf', which does not currently work on JRuby (https://github.com/protocolbuffers/protobuf/issues/1594)
59
+ - rvm: jruby-9.1.7.0
60
+ gemfile: testing/gemfiles/gherkin6.gemfile
61
+ - rvm: jruby-9.1.7.0
62
+ gemfile: testing/gemfiles/gherkin7.gemfile
63
+ - rvm: jruby-9.1.7.0
64
+ gemfile: testing/gemfiles/gherkin8.gemfile
65
+ - rvm: jruby-9.1.7.0
66
+ gemfile: testing/gemfiles/gherkin9.gemfile
67
+
68
+ # Travis does not provide 1.8.7 on OSX
69
+ - rvm: 1.8.7
70
+ os: osx
71
+ # Travis does not provide 1.9.3 on OSX
72
+ - rvm: 1.9.3
73
+ os: osx
74
+ # Ruby 2.3.x is currently broken on TravisCI for OSX and is no longer a supported Ruby version, anyway.
75
+ - rvm: 2.3.8
76
+ os: osx
59
77
 
60
78
  before_install:
61
79
  - gem install bundler -v '< 2'
62
-
80
+
63
81
  script: bundle exec rake cuke_modeler:ci_build
@@ -8,8 +8,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  Nothing yet...
10
10
 
11
+ ## [2.1.0] - 2020-05-27
11
12
 
12
- ## [2.0.0] - 2019-02-11
13
+ ### Added
14
+ - Support added for more versions of the `gherkin` gem
15
+ - 9.x
16
+ - 8.x
17
+ - 7.x
18
+
19
+ ### Fixed
20
+ - Parsing errors are now correctly bubbled up when using Gherkin 6.x
21
+
22
+ ## [2.0.0] - 2020-02-11
13
23
 
14
24
  ### Changed
15
25
 
@@ -277,7 +287,8 @@ Nothing yet...
277
287
  - Initial release
278
288
 
279
289
 
280
- [Unreleased]: https://github.com/enkessler/cuke_modeler/compare/v2.0.0...HEAD
290
+ [Unreleased]: https://github.com/enkessler/cuke_modeler/compare/v2.1.0...HEAD
291
+ [2.1.0]: https://github.com/enkessler/cuke_modeler/compare/v2.0.0...v2.1.0
281
292
  [2.0.0]: https://github.com/enkessler/cuke_modeler/compare/v1.5.1...v2.0.0
282
293
  [1.5.1]: https://github.com/enkessler/cuke_modeler/compare/v1.5.0...v1.5.1
283
294
  [1.5.0]: https://github.com/enkessler/cuke_modeler/compare/v1.4.0...v1.5.0
data/Gemfile CHANGED
@@ -21,17 +21,24 @@ if RUBY_VERSION =~ /^1\./
21
21
  gem 'gherkin', '< 2.12.1' # Ruby 1.8.x support dropped after this version
22
22
  gem 'rainbow', '< 2.0' # Ruby 1.8.x support dropped after this version
23
23
  gem 'rake', '< 11.0' # Ruby 1.8.x support dropped after this version
24
+ gem 'mime-types', '< 2.0' # Ruby 1.8.x support dropped after this version
24
25
  else
25
26
  gem 'rake', '< 12.3.0' # Ruby 1.9.x support dropped after this version
26
27
  gem 'cucumber', '< 3.0.0' # Ruby 1.9.x support dropped after this version
28
+ gem 'rainbow', '< 3.0' # Ruby 1.9.x support dropped after this version
29
+ gem 'mime-types', '< 3.0' # Ruby 1.x support dropped after this version
27
30
  end
28
31
 
32
+ gem 'simplecov', '< 0.18' # Ruby 1.x support dropped after this version
33
+ gem 'thor', '< 1.0' # Ruby 1.x support dropped after this version
29
34
  elsif RUBY_VERSION =~ /^2\./
30
35
 
31
36
  if RUBY_VERSION =~ /^2\.[23456789]/
32
37
  gem 'test-unit'
33
38
  end
34
39
 
35
- gem 'gherkin', '~> 6.0'
36
- gem 'cucumber', '~>4.0.rc'
37
40
  end
41
+
42
+ # Note: When testing against 6.x, the latest version (6.0.17) is missing an executable for Windows 64-bit
43
+ # gem 'gherkin', '>= 6.0', '< 6.0.17'
44
+ gem 'gherkin', '~> 9.0'
@@ -3,7 +3,7 @@ version: '1.0.{build}'
3
3
  environment:
4
4
  matrix:
5
5
 
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
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
7
7
  - RUBY_VERSION: 24-x64
8
8
  BUNDLE_GEMFILE: testing/gemfiles/gherkin2.gemfile
9
9
  - RUBY_VERSION: 25-x64
@@ -36,7 +36,7 @@ environment:
36
36
  - RUBY_VERSION: 25-x64
37
37
  BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
38
38
 
39
- # Gherkin 6.x requires at least Ruby 2.2
39
+ # Gherkin 6.x+ requires at least Ruby 2.2
40
40
  - RUBY_VERSION: 24
41
41
  BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
42
42
  - RUBY_VERSION: 24-x64
@@ -46,6 +46,33 @@ environment:
46
46
  - RUBY_VERSION: 25-x64
47
47
  BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
48
48
 
49
+ - RUBY_VERSION: 24
50
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin7.gemfile
51
+ - RUBY_VERSION: 24-x64
52
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin7.gemfile
53
+ - RUBY_VERSION: 25
54
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin7.gemfile
55
+ - RUBY_VERSION: 25-x64
56
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin7.gemfile
57
+
58
+ - RUBY_VERSION: 24
59
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin8.gemfile
60
+ - RUBY_VERSION: 24-x64
61
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin8.gemfile
62
+ - RUBY_VERSION: 25
63
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin8.gemfile
64
+ - RUBY_VERSION: 25-x64
65
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin8.gemfile
66
+
67
+ - RUBY_VERSION: 24
68
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin9.gemfile
69
+ - RUBY_VERSION: 24-x64
70
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin9.gemfile
71
+ - RUBY_VERSION: 25
72
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin9.gemfile
73
+ - RUBY_VERSION: 25-x64
74
+ BUNDLE_GEMFILE: testing/gemfiles/gherkin9.gemfile
75
+
49
76
  install:
50
77
  - set PATH=C:\Ruby%RUBY_VERSION%\bin;%PATH%
51
78
  - bundle install
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 1.8.7', '< 3.0'
22
22
 
23
- spec.add_runtime_dependency 'gherkin', '< 7.0'
23
+ spec.add_runtime_dependency 'gherkin', '< 10.0'
24
24
  spec.add_runtime_dependency('json', '>= 1.0', '< 3.0')
25
25
  spec.add_runtime_dependency('multi_json', '~> 1.0')
26
26
 
@@ -1,7 +1,7 @@
1
1
  module CukeModeler
2
2
 
3
3
  # NOT A PART OF THE PUBLIC API
4
- # An adapter that can convert the output of version 4.x and 5.x of the *gherkin* gem into input that is consumable by this gem.
4
+ # An adapter that can convert the output of version 4.x of the *gherkin* gem into input that is consumable by this gem.
5
5
 
6
6
  class Gherkin4Adapter
7
7
 
@@ -0,0 +1,12 @@
1
+ require_relative 'gherkin_4_adapter'
2
+
3
+ module CukeModeler
4
+
5
+ # NOT A PART OF THE PUBLIC API
6
+ # An adapter that can convert the output of version 5.x of the *gherkin* gem into input that is consumable by this gem.
7
+
8
+ class Gherkin5Adapter < Gherkin4Adapter
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,307 @@
1
+ module CukeModeler
2
+
3
+ # NOT A PART OF THE PUBLIC API
4
+ # An adapter that can convert the output of version 7.x of the *gherkin* gem into input that is consumable by this gem.
5
+
6
+ class Gherkin7Adapter
7
+
8
+ # Adapts the given AST into the shape that this gem expects
9
+ def adapt(parsed_ast)
10
+ # Saving off the original data
11
+ parsed_ast['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_ast))
12
+
13
+ # Removing parsed data for child elements in order to avoid duplicating data
14
+ parsed_ast['cuke_modeler_parsing_data'][:feature] = nil
15
+ parsed_ast['cuke_modeler_parsing_data'][:comments] = nil
16
+
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
+ parsed_example[:table_body].each do |row|
156
+ adapt_table_row!(row)
157
+ end
158
+ parsed_example['rows'].concat(parsed_example.delete(:table_body))
159
+ end
160
+
161
+ parsed_example['tags'] = []
162
+ parsed_example[:tags].each do |tag|
163
+ adapt_tag!(tag)
164
+ end
165
+ parsed_example['tags'].concat(parsed_example.delete(:tags))
166
+ end
167
+
168
+ # Adapts the AST sub-tree that is rooted at the given tag node.
169
+ def adapt_tag!(parsed_tag)
170
+ # Saving off the original data
171
+ parsed_tag['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_tag))
172
+
173
+ parsed_tag['name'] = parsed_tag.delete(:name)
174
+ parsed_tag['line'] = parsed_tag.delete(:location)[:line]
175
+ end
176
+
177
+ # Adapts the AST sub-tree that is rooted at the given comment node.
178
+ def adapt_comment!(parsed_comment)
179
+ # Saving off the original data
180
+ parsed_comment['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_comment))
181
+
182
+ parsed_comment['text'] = parsed_comment.delete(:text)
183
+ parsed_comment['line'] = parsed_comment.delete(:location)[:line]
184
+ end
185
+
186
+ # Adapts the AST sub-tree that is rooted at the given step node.
187
+ def adapt_step!(parsed_step)
188
+ # Saving off the original data
189
+ parsed_step['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step))
190
+
191
+ # Removing parsed data for child elements in order to avoid duplicating data
192
+ parsed_step['cuke_modeler_parsing_data'][:data_table] = nil
193
+ parsed_step['cuke_modeler_parsing_data'][:doc_string] = nil
194
+
195
+ parsed_step['keyword'] = parsed_step.delete(:keyword)
196
+ parsed_step['name'] = parsed_step.delete(:text)
197
+ parsed_step['line'] = parsed_step.delete(:location)[:line]
198
+
199
+
200
+ case
201
+ when parsed_step[:doc_string]
202
+ adapt_doc_string!(parsed_step[:doc_string])
203
+ parsed_step['doc_string'] = parsed_step.delete(:doc_string)
204
+ when parsed_step[:data_table]
205
+ adapt_step_table!(parsed_step[:data_table])
206
+ parsed_step['table'] = parsed_step.delete(:data_table)
207
+ else
208
+ # Step has no extra argument
209
+ end
210
+ end
211
+
212
+ # Adapts the AST sub-tree that is rooted at the given doc string node.
213
+ def adapt_doc_string!(parsed_doc_string)
214
+ # Saving off the original data
215
+ parsed_doc_string['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_doc_string))
216
+
217
+ parsed_doc_string['value'] = parsed_doc_string.delete(:content)
218
+ 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
219
+ parsed_doc_string['line'] = parsed_doc_string.delete(:location)[:line]
220
+ end
221
+
222
+ # Adapts the AST sub-tree that is rooted at the given table node.
223
+ def adapt_step_table!(parsed_step_table)
224
+ # Saving off the original data
225
+ parsed_step_table['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step_table))
226
+
227
+ # Removing parsed data for child elements in order to avoid duplicating data
228
+ parsed_step_table['cuke_modeler_parsing_data'][:rows] = nil
229
+
230
+ parsed_step_table['rows'] = []
231
+ parsed_step_table[:rows].each do |row|
232
+ adapt_table_row!(row)
233
+ end
234
+ parsed_step_table['rows'].concat(parsed_step_table.delete(:rows))
235
+ parsed_step_table['line'] = parsed_step_table.delete(:location)[:line]
236
+ end
237
+
238
+ # Adapts the AST sub-tree that is rooted at the given row node.
239
+ def adapt_table_row!(parsed_table_row)
240
+ # Saving off the original data
241
+ parsed_table_row['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_table_row))
242
+
243
+ # Removing parsed data for child elements in order to avoid duplicating data which the child elements will themselves include
244
+ parsed_table_row['cuke_modeler_parsing_data'][:cells] = nil
245
+
246
+
247
+ parsed_table_row['line'] = parsed_table_row.delete(:location)[:line]
248
+
249
+ parsed_table_row['cells'] = []
250
+ parsed_table_row[:cells].each do |row|
251
+ adapt_table_cell!(row)
252
+ end
253
+ parsed_table_row['cells'].concat(parsed_table_row.delete(:cells))
254
+ end
255
+
256
+ # Adapts the AST sub-tree that is rooted at the given cell node.
257
+ def adapt_table_cell!(parsed_cell)
258
+ # Saving off the original data
259
+ parsed_cell['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_cell))
260
+
261
+ parsed_cell['value'] = parsed_cell.delete(:value)
262
+ parsed_cell['line'] = parsed_cell.delete(:location)[:line]
263
+ end
264
+
265
+
266
+ private
267
+
268
+
269
+ def adapt_child_elements!(parsed_children)
270
+ return if parsed_children.empty?
271
+
272
+ background_child = parsed_children.find { |child| child[:background] }
273
+
274
+ if background_child
275
+ adapt_background!(background_child)
276
+
277
+ remaining_children = parsed_children.reject { |child| child[:background] }
278
+ end
279
+
280
+ adapt_tests!(remaining_children || parsed_children)
281
+ end
282
+
283
+ def adapt_tests!(parsed_tests)
284
+ return unless parsed_tests
285
+
286
+ parsed_tests.each do |test|
287
+ adapt_test!(test)
288
+ end
289
+ end
290
+
291
+ def adapt_test!(parsed_test)
292
+ # Saving off the original data
293
+ parsed_test['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_test))
294
+
295
+
296
+ case
297
+ when parsed_test[:scenario] && parsed_test[:scenario][:examples].any?
298
+ adapt_outline!(parsed_test)
299
+ when parsed_test[:scenario]
300
+ adapt_scenario!(parsed_test)
301
+ else
302
+ raise(ArgumentError, "Unknown test type with keys: #{parsed_test.keys}")
303
+ end
304
+ end
305
+
306
+ end
307
+ end