cuke_modeler 1.5.1 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +13 -15
  5. data/cuke_modeler.gemspec +12 -9
  6. data/lib/cuke_modeler.rb +1 -0
  7. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  11. data/lib/cuke_modeler/adapters/gherkin_14_adapter.rb +12 -0
  12. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +105 -69
  13. data/lib/cuke_modeler/containing.rb +16 -5
  14. data/lib/cuke_modeler/described.rb +1 -0
  15. data/lib/cuke_modeler/models/background.rb +1 -1
  16. data/lib/cuke_modeler/models/cell.rb +1 -1
  17. data/lib/cuke_modeler/models/comment.rb +1 -1
  18. data/lib/cuke_modeler/models/directory.rb +2 -2
  19. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  20. data/lib/cuke_modeler/models/example.rb +1 -1
  21. data/lib/cuke_modeler/models/feature.rb +16 -5
  22. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  23. data/lib/cuke_modeler/models/outline.rb +1 -1
  24. data/lib/cuke_modeler/models/row.rb +1 -1
  25. data/lib/cuke_modeler/models/rule.rb +99 -0
  26. data/lib/cuke_modeler/models/scenario.rb +1 -1
  27. data/lib/cuke_modeler/models/step.rb +32 -3
  28. data/lib/cuke_modeler/models/table.rb +1 -1
  29. data/lib/cuke_modeler/models/tag.rb +1 -1
  30. data/lib/cuke_modeler/named.rb +1 -0
  31. data/lib/cuke_modeler/nested.rb +1 -0
  32. data/lib/cuke_modeler/parsed.rb +1 -0
  33. data/lib/cuke_modeler/parsing.rb +89 -102
  34. data/lib/cuke_modeler/sourceable.rb +1 -0
  35. data/lib/cuke_modeler/stepped.rb +1 -0
  36. data/lib/cuke_modeler/taggable.rb +1 -0
  37. data/lib/cuke_modeler/version.rb +1 -1
  38. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  39. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  40. data/testing/cucumber/features/modeling/feature_modeling.feature +28 -7
  41. data/testing/cucumber/features/modeling/feature_output.feature +45 -23
  42. data/testing/cucumber/features/modeling/rule_modeling.feature +108 -0
  43. data/testing/cucumber/features/modeling/rule_output.feature +111 -0
  44. metadata +39 -140
  45. data/.gitignore +0 -18
  46. data/.simplecov +0 -7
  47. data/.travis.yml +0 -60
  48. data/Gemfile +0 -37
  49. data/Rakefile +0 -73
  50. data/appveyor.yml +0 -61
  51. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  52. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  53. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  54. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  55. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  56. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  57. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  58. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  59. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  60. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  61. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  62. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  63. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  64. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  65. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  66. data/testing/cucumber/support/env.rb +0 -30
  67. data/testing/dialect_helper.rb +0 -48
  68. data/testing/file_helper.rb +0 -47
  69. data/testing/gemfiles/gherkin2.gemfile +0 -33
  70. data/testing/gemfiles/gherkin3.gemfile +0 -26
  71. data/testing/gemfiles/gherkin4.gemfile +0 -27
  72. data/testing/gemfiles/gherkin5.gemfile +0 -27
  73. data/testing/gemfiles/gherkin6.gemfile +0 -10
  74. data/testing/rspec/spec/integration/adapters/gherkin_2_adapter_spec.rb +0 -166
  75. data/testing/rspec/spec/integration/adapters/gherkin_3_adapter_spec.rb +0 -166
  76. data/testing/rspec/spec/integration/adapters/gherkin_4_adapter_spec.rb +0 -165
  77. data/testing/rspec/spec/integration/adapters/gherkin_6_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/models/background_integration_spec.rb +0 -442
  79. data/testing/rspec/spec/integration/models/cell_integration_spec.rb +0 -335
  80. data/testing/rspec/spec/integration/models/comment_integration_spec.rb +0 -177
  81. data/testing/rspec/spec/integration/models/directory_integration_spec.rb +0 -218
  82. data/testing/rspec/spec/integration/models/doc_string_integration_spec.rb +0 -402
  83. data/testing/rspec/spec/integration/models/example_integration_spec.rb +0 -741
  84. data/testing/rspec/spec/integration/models/feature_file_integration_spec.rb +0 -272
  85. data/testing/rspec/spec/integration/models/feature_integration_spec.rb +0 -650
  86. data/testing/rspec/spec/integration/models/model_integration_spec.rb +0 -15
  87. data/testing/rspec/spec/integration/models/outline_integration_spec.rb +0 -624
  88. data/testing/rspec/spec/integration/models/row_integration_spec.rb +0 -291
  89. data/testing/rspec/spec/integration/models/scenario_integration_spec.rb +0 -479
  90. data/testing/rspec/spec/integration/models/step_integration_spec.rb +0 -475
  91. data/testing/rspec/spec/integration/models/table_integration_spec.rb +0 -337
  92. data/testing/rspec/spec/integration/models/tag_integration_spec.rb +0 -259
  93. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  94. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -122
  95. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  96. data/testing/rspec/spec/spec_helper.rb +0 -125
  97. data/testing/rspec/spec/unit/cuke_modeler_unit_spec.rb +0 -25
  98. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  99. data/testing/rspec/spec/unit/models/background_unit_spec.rb +0 -83
  100. data/testing/rspec/spec/unit/models/cell_unit_spec.rb +0 -68
  101. data/testing/rspec/spec/unit/models/comment_unit_spec.rb +0 -68
  102. data/testing/rspec/spec/unit/models/directory_unit_spec.rb +0 -127
  103. data/testing/rspec/spec/unit/models/doc_string_unit_spec.rb +0 -100
  104. data/testing/rspec/spec/unit/models/example_unit_spec.rb +0 -133
  105. data/testing/rspec/spec/unit/models/feature_file_unit_spec.rb +0 -125
  106. data/testing/rspec/spec/unit/models/feature_unit_spec.rb +0 -157
  107. data/testing/rspec/spec/unit/models/model_unit_spec.rb +0 -15
  108. data/testing/rspec/spec/unit/models/outline_unit_spec.rb +0 -117
  109. data/testing/rspec/spec/unit/models/row_unit_spec.rb +0 -68
  110. data/testing/rspec/spec/unit/models/scenario_unit_spec.rb +0 -86
  111. data/testing/rspec/spec/unit/models/step_unit_spec.rb +0 -109
  112. data/testing/rspec/spec/unit/models/table_unit_spec.rb +0 -77
  113. data/testing/rspec/spec/unit/models/tag_unit_spec.rb +0 -68
  114. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  115. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  116. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  117. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  118. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  119. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -127
  120. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  121. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  122. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  123. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  124. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  125. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  126. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  127. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  128. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  129. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  130. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  131. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  132. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  133. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  134. data/testing/test_languages.json +0 -45
  135. data/todo.txt +0 -24
@@ -1,61 +0,0 @@
1
- version: '1.0.{build}'
2
-
3
- environment:
4
- matrix:
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
7
- - RUBY_VERSION: 24-x64
8
- BUNDLE_GEMFILE: testing/gemfiles/gherkin2.gemfile
9
- - RUBY_VERSION: 25-x64
10
- BUNDLE_GEMFILE: testing/gemfiles/gherkin2.gemfile
11
-
12
- - RUBY_VERSION: 24
13
- BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
14
- - RUBY_VERSION: 24-x64
15
- BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
16
- - RUBY_VERSION: 25
17
- BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
18
- - RUBY_VERSION: 25-x64
19
- BUNDLE_GEMFILE: testing/gemfiles/gherkin3.gemfile
20
-
21
- - RUBY_VERSION: 24
22
- BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
23
- - RUBY_VERSION: 24-x64
24
- BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
25
- - RUBY_VERSION: 25
26
- BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
27
- - RUBY_VERSION: 25-x64
28
- BUNDLE_GEMFILE: testing/gemfiles/gherkin4.gemfile
29
-
30
- - RUBY_VERSION: 24
31
- BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
32
- - RUBY_VERSION: 24-x64
33
- BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
34
- - RUBY_VERSION: 25
35
- BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
36
- - RUBY_VERSION: 25-x64
37
- BUNDLE_GEMFILE: testing/gemfiles/gherkin5.gemfile
38
-
39
- # Gherkin 6.x requires at least Ruby 2.2
40
- - RUBY_VERSION: 24
41
- BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
42
- - RUBY_VERSION: 24-x64
43
- BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
44
- - RUBY_VERSION: 25
45
- BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
46
- - RUBY_VERSION: 25-x64
47
- BUNDLE_GEMFILE: testing/gemfiles/gherkin6.gemfile
48
-
49
- install:
50
- - set PATH=C:\Ruby%RUBY_VERSION%\bin;%PATH%
51
- - bundle install
52
-
53
- build: off
54
-
55
- before_test:
56
- - ruby -v
57
- - gem -v
58
- - bundle -v
59
-
60
- test_script:
61
- - bundle exec rake cuke_modeler:ci_build
@@ -1,273 +0,0 @@
1
- module CukeModeler
2
-
3
- # An adapter that can convert the output of version 2.x of the *gherkin* gem into input that is consumable by this gem.
4
-
5
- class Gherkin2Adapter
6
-
7
- # Adapts the given AST into the shape that this gem expects
8
- def adapt(parsed_ast)
9
- parsed_data = {}
10
-
11
- # The entire AST is just an array with one feature and we don't want to save any child data so...an empty array
12
- parsed_data['cuke_modeler_parsing_data'] = []
13
-
14
- # Comments are stored on child elements in gherkin 2.x
15
- comments = []
16
-
17
- # An AST is just one feature
18
- adapt_feature!(parsed_ast.first, comments) if parsed_ast.first
19
- parsed_data['feature'] = parsed_ast.first
20
-
21
- # Adapt and store comments once they have all been gathered
22
- comments.each do |comment|
23
- adapt_comment!(comment)
24
- end
25
- parsed_data['comments'] = comments
26
-
27
-
28
- [parsed_data]
29
- end
30
-
31
- # Adapts the AST sub-tree that is rooted at the given feature node.
32
- def adapt_feature!(parsed_feature, gathered_comments)
33
- # Saving off the original data
34
- parsed_feature['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_feature))
35
-
36
- # Removing parsed data for child elements in order to avoid duplicating data
37
- parsed_feature['cuke_modeler_parsing_data']['tags'] = nil
38
- parsed_feature['cuke_modeler_parsing_data']['elements'] = nil
39
-
40
- if parsed_feature['comments']
41
- parsed_feature['cuke_modeler_parsing_data']['comments'] = nil
42
- gathered_comments.concat(parsed_feature['comments'])
43
- end
44
-
45
- adapt_child_elements!(parsed_feature, gathered_comments)
46
-
47
- if parsed_feature['tags']
48
- parsed_feature['tags'].each do |tag|
49
- adapt_tag!(tag)
50
- end
51
- end
52
- end
53
-
54
- # Adapts the AST sub-tree that is rooted at the given background node.
55
- def adapt_background!(parsed_background, gathered_comments)
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']['steps'] = nil
61
-
62
- if parsed_background['comments']
63
- parsed_background['cuke_modeler_parsing_data']['comments'] = nil
64
- gathered_comments.concat(parsed_background['comments'])
65
- end
66
-
67
- if parsed_background['steps']
68
- parsed_background['steps'].each do |step|
69
- adapt_step!(step, gathered_comments)
70
- end
71
- end
72
- end
73
-
74
- # Adapts the AST sub-tree that is rooted at the given scenario node.
75
- def adapt_scenario!(parsed_scenario, gathered_comments)
76
- # Saving off the original data
77
- parsed_scenario['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_scenario))
78
-
79
- # Removing parsed data for child elements in order to avoid duplicating data
80
- parsed_scenario['cuke_modeler_parsing_data']['tags'] = nil
81
- parsed_scenario['cuke_modeler_parsing_data']['steps'] = nil
82
-
83
- if parsed_scenario['comments']
84
- parsed_scenario['cuke_modeler_parsing_data']['comments'] = nil
85
- gathered_comments.concat(parsed_scenario['comments'])
86
- end
87
-
88
- if parsed_scenario['tags']
89
- parsed_scenario['tags'].each do |tag|
90
- adapt_tag!(tag)
91
- end
92
- end
93
-
94
- if parsed_scenario['steps']
95
- parsed_scenario['steps'].each do |step|
96
- adapt_step!(step, gathered_comments)
97
- end
98
- end
99
- end
100
-
101
- # Adapts the AST sub-tree that is rooted at the given outline node.
102
- def adapt_outline!(parsed_outline, gathered_comments)
103
- # Saving off the original data
104
- parsed_outline['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_outline))
105
-
106
- # Removing parsed data for child elements in order to avoid duplicating data
107
- parsed_outline['cuke_modeler_parsing_data']['tags'] = nil
108
- parsed_outline['cuke_modeler_parsing_data']['steps'] = nil
109
- parsed_outline['cuke_modeler_parsing_data']['examples'] = nil
110
-
111
- if parsed_outline['comments']
112
- parsed_outline['cuke_modeler_parsing_data']['comments'] = nil
113
- gathered_comments.concat(parsed_outline['comments'])
114
- end
115
-
116
- if parsed_outline['tags']
117
- parsed_outline['tags'].each do |tag|
118
- adapt_tag!(tag)
119
- end
120
- end
121
-
122
- if parsed_outline['steps']
123
- parsed_outline['steps'].each do |step|
124
- adapt_step!(step, gathered_comments)
125
- end
126
- end
127
-
128
- if parsed_outline['examples']
129
- parsed_outline['examples'].each do |example|
130
- adapt_example!(example, gathered_comments)
131
- end
132
- end
133
- end
134
-
135
- # Adapts the AST sub-tree that is rooted at the given example node.
136
- def adapt_example!(parsed_example, gathered_comments)
137
- # Saving off the original data
138
- parsed_example['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_example))
139
-
140
- # Removing parsed data for child elements in order to avoid duplicating data
141
- parsed_example['cuke_modeler_parsing_data']['tags'] = nil
142
- parsed_example['cuke_modeler_parsing_data']['rows'] = nil
143
-
144
- if parsed_example['comments']
145
- parsed_example['cuke_modeler_parsing_data']['comments'] = nil
146
- gathered_comments.concat(parsed_example['comments'])
147
- end
148
-
149
- parsed_example['rows'].each do |row|
150
- adapt_table_row!(row, gathered_comments)
151
- end
152
-
153
- if parsed_example['tags']
154
- parsed_example['tags'].each do |tag|
155
- adapt_tag!(tag)
156
- end
157
- end
158
- end
159
-
160
- # Adapts the AST sub-tree that is rooted at the given tag node.
161
- def adapt_tag!(parsed_tag)
162
- # Saving off the original data
163
- parsed_tag['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_tag))
164
- end
165
-
166
- # Adapts the AST sub-tree that is rooted at the given comment node.
167
- def adapt_comment!(parsed_comment)
168
- # Saving off the original data
169
- parsed_comment['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_comment))
170
-
171
- parsed_comment['text'] = parsed_comment.delete('value')
172
- parsed_comment['line'] = parsed_comment.delete('line')
173
- end
174
-
175
- # Adapts the AST sub-tree that is rooted at the given step node.
176
- def adapt_step!(parsed_step, gathered_comments)
177
- # Saving off the original data
178
- parsed_step['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step))
179
-
180
- # Removing parsed data for child elements in order to avoid duplicating data
181
- parsed_step['cuke_modeler_parsing_data']['rows'] = nil if parsed_step['cuke_modeler_parsing_data']['rows']
182
- parsed_step['cuke_modeler_parsing_data']['doc_string'] = nil if parsed_step['cuke_modeler_parsing_data']['doc_string']
183
-
184
- if parsed_step['comments']
185
- parsed_step['cuke_modeler_parsing_data']['comments'] = nil
186
- gathered_comments.concat(parsed_step['comments'])
187
- end
188
-
189
- adapt_doc_string!(parsed_step['doc_string']) if parsed_step['doc_string']
190
-
191
- if parsed_step['rows']
192
- parsed_step['table'] = {'rows' => parsed_step['rows']}
193
- adapt_step_table!(parsed_step['table'], gathered_comments)
194
- end
195
- end
196
-
197
- # Adapts the AST sub-tree that is rooted at the given doc string node.
198
- def adapt_doc_string!(parsed_doc_string)
199
- # Saving off the original data
200
- parsed_doc_string['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_doc_string))
201
- end
202
-
203
- # Adapts the AST sub-tree that is rooted at the given table node.
204
- def adapt_step_table!(parsed_step_table, gathered_comments)
205
- # Saving off the original data
206
- parsed_step_table['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step_table['rows']))
207
-
208
- # Removing parsed data for child elements in order to avoid duplicating data
209
- parsed_step_table['cuke_modeler_parsing_data'].clear
210
-
211
-
212
- parsed_step_table['line'] = parsed_step_table['rows'].first['line']
213
-
214
- parsed_step_table['rows'].each do |row|
215
- adapt_table_row!(row, gathered_comments)
216
- end
217
- end
218
-
219
- # Adapts the AST sub-tree that is rooted at the given row node.
220
- def adapt_table_row!(parsed_table_row, gathered_comments)
221
- # Saving off the original data
222
- parsed_table_row['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_table_row))
223
-
224
- # Removing parsed data for child elements in order to avoid duplicating data which the child elements will themselves include
225
- parsed_table_row['cuke_modeler_parsing_data']['cells'] = nil
226
-
227
- if parsed_table_row['comments']
228
- parsed_table_row['cuke_modeler_parsing_data']['comments'] = nil
229
- gathered_comments.concat(parsed_table_row['comments'])
230
- end
231
-
232
- parsed_table_row['cells'].collect! do |cell|
233
- create_cell_for(cell, parsed_table_row['line'])
234
- end
235
- end
236
-
237
- # Adapts the AST sub-tree that is rooted at the given cell node.
238
- def create_cell_for(parsed_cell, line_number)
239
- cell = {}
240
-
241
- # Saving off the original data
242
- cell['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_cell))
243
-
244
- cell['value'] = parsed_cell
245
- cell['line'] = line_number
246
-
247
-
248
- cell
249
- end
250
-
251
-
252
- private
253
-
254
-
255
- def adapt_child_elements!(parsed_feature, gathered_comments)
256
- if parsed_feature['elements']
257
- parsed_feature['elements'].each do |element|
258
- case element['type']
259
- when 'background'
260
- adapt_background!(element, gathered_comments)
261
- when 'scenario'
262
- adapt_scenario!(element, gathered_comments)
263
- when 'scenario_outline'
264
- adapt_outline!(element, gathered_comments)
265
- else
266
- raise(ArgumentError, "Unknown element type: #{element['type']}")
267
- end
268
- end
269
- end
270
- end
271
-
272
- end
273
- end
@@ -1,296 +0,0 @@
1
- module CukeModeler
2
-
3
- # An adapter that can convert the output of version 3.x of the *gherkin* gem into input that is consumable by this gem.
4
-
5
- class Gherkin3Adapter
6
-
7
- # Adapts the given AST into the shape that this gem expects
8
- def adapt(parsed_ast)
9
- parsed_data = {}
10
-
11
- # No data exists stored above feature level
12
- parsed_data['cuke_modeler_parsing_data'] = nil
13
-
14
- # Comments are stored on the feature in gherkin 3.x
15
- parsed_data['comments'] = []
16
- parsed_ast[:comments].each do |comment|
17
- adapt_comment!(comment)
18
- end
19
- parsed_data['comments'].concat(parsed_ast.delete(:comments))
20
-
21
- # An AST is just one feature
22
- adapt_feature!(parsed_ast)
23
-
24
- parsed_data['feature'] = parsed_ast
25
-
26
- [parsed_data]
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'][:scenarioDefinitions] = nil
37
- parsed_feature['cuke_modeler_parsing_data'][:background] = nil
38
- parsed_feature['cuke_modeler_parsing_data'][:comments] = nil
39
-
40
- parsed_feature['keyword'] = parsed_feature.delete(:keyword)
41
- parsed_feature['name'] = parsed_feature.delete(:name)
42
- parsed_feature['description'] = parsed_feature.delete(:description) || ''
43
- parsed_feature['line'] = parsed_feature.delete(:location)[:line]
44
-
45
- parsed_feature['elements'] = []
46
- adapt_child_elements!(parsed_feature)
47
- parsed_feature['elements'].concat(parsed_feature.delete(:scenarioDefinitions))
48
- parsed_feature['elements'] << parsed_feature.delete(:background) if parsed_feature[:background]
49
-
50
- parsed_feature['tags'] = []
51
- parsed_feature[:tags].each do |tag|
52
- adapt_tag!(tag)
53
- end
54
- parsed_feature['tags'].concat(parsed_feature.delete(:tags))
55
- end
56
-
57
- # Adapts the AST sub-tree that is rooted at the given background node.
58
- def adapt_background!(parsed_background)
59
- # Saving off the original data
60
- parsed_background['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_background))
61
-
62
- # Removing parsed data for child elements in order to avoid duplicating data
63
- parsed_background['cuke_modeler_parsing_data'][:steps] = nil
64
-
65
- parsed_background['type'] = parsed_background.delete(:type).to_s
66
- parsed_background['keyword'] = parsed_background.delete(:keyword).to_s
67
- parsed_background['name'] = parsed_background.delete(:name)
68
- parsed_background['description'] = parsed_background.delete(:description) || ''
69
- parsed_background['line'] = parsed_background.delete(:location)[:line]
70
-
71
- parsed_background['steps'] = []
72
- parsed_background[:steps].each do |step|
73
- adapt_step!(step)
74
- end
75
- parsed_background['steps'].concat(parsed_background.delete(:steps))
76
- end
77
-
78
- # Adapts the AST sub-tree that is rooted at the given scenario node.
79
- def adapt_scenario!(parsed_test)
80
- # Removing parsed data for child elements in order to avoid duplicating data
81
- parsed_test['cuke_modeler_parsing_data'][:tags] = nil
82
- parsed_test['cuke_modeler_parsing_data'][:steps] = nil
83
-
84
-
85
- parsed_test['name'] = parsed_test.delete(:name)
86
- parsed_test['description'] = parsed_test.delete(:description) || ''
87
- parsed_test['line'] = parsed_test.delete(:location)[:line]
88
-
89
- parsed_test['tags'] = []
90
- parsed_test[:tags].each do |tag|
91
- adapt_tag!(tag)
92
- end
93
- parsed_test['tags'].concat(parsed_test.delete(:tags))
94
-
95
- parsed_test['steps'] = []
96
- parsed_test[:steps].each do |step|
97
- adapt_step!(step)
98
- end
99
- parsed_test['steps'].concat(parsed_test.delete(:steps))
100
- end
101
-
102
- # Adapts the AST sub-tree that is rooted at the given outline node.
103
- def adapt_outline!(parsed_test)
104
- # Removing parsed data for child elements in order to avoid duplicating data
105
- parsed_test['cuke_modeler_parsing_data'][:tags] = nil
106
- parsed_test['cuke_modeler_parsing_data'][:steps] = nil
107
- parsed_test['cuke_modeler_parsing_data'][:examples] = nil
108
-
109
- parsed_test['name'] = parsed_test.delete(:name)
110
- parsed_test['description'] = parsed_test.delete(:description) || ''
111
- parsed_test['line'] = parsed_test.delete(:location)[:line]
112
-
113
- parsed_test['tags'] = []
114
- parsed_test[:tags].each do |tag|
115
- adapt_tag!(tag)
116
- end
117
- parsed_test['tags'].concat(parsed_test.delete(:tags))
118
-
119
- parsed_test['steps'] = []
120
- parsed_test[:steps].each do |step|
121
- adapt_step!(step)
122
- end
123
- parsed_test['steps'].concat(parsed_test.delete(:steps))
124
-
125
- parsed_test['examples'] = []
126
- parsed_test[:examples].each do |step|
127
- adapt_example!(step)
128
- end
129
- parsed_test['examples'].concat(parsed_test.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'][:tableHeader] = nil
140
- parsed_example['cuke_modeler_parsing_data'][:tableBody] = 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
- adapt_table_row!(parsed_example[:tableHeader])
149
- parsed_example['rows'] << parsed_example.delete(:tableHeader)
150
-
151
- parsed_example[:tableBody].each do |row|
152
- adapt_table_row!(row)
153
- end
154
- parsed_example['rows'].concat(parsed_example.delete(:tableBody))
155
-
156
- parsed_example['tags'] = []
157
- parsed_example[:tags].each do |tag|
158
- adapt_tag!(tag)
159
- end
160
- parsed_example['tags'].concat(parsed_example.delete(:tags))
161
- end
162
-
163
- # Adapts the AST sub-tree that is rooted at the given tag node.
164
- def adapt_tag!(parsed_tag)
165
- # Saving off the original data
166
- parsed_tag['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_tag))
167
-
168
- parsed_tag['name'] = parsed_tag.delete(:name)
169
- parsed_tag['line'] = parsed_tag.delete(:location)[:line]
170
- end
171
-
172
- # Adapts the AST sub-tree that is rooted at the given comment node.
173
- def adapt_comment!(parsed_comment)
174
- # Saving off the original data
175
- parsed_comment['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_comment))
176
-
177
- parsed_comment['text'] = parsed_comment.delete(:text)
178
- parsed_comment['line'] = parsed_comment.delete(:location)[:line]
179
- end
180
-
181
- # Adapts the AST sub-tree that is rooted at the given step node.
182
- def adapt_step!(parsed_step)
183
- # Saving off the original data
184
- parsed_step['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step))
185
-
186
- # Removing parsed data for child elements in order to avoid duplicating data
187
- parsed_step['cuke_modeler_parsing_data'][:argument] = nil
188
-
189
- parsed_step['keyword'] = parsed_step.delete(:keyword)
190
- parsed_step['name'] = parsed_step.delete(:text)
191
- parsed_step['line'] = parsed_step.delete(:location)[:line]
192
-
193
-
194
- step_argument = parsed_step[:argument]
195
-
196
- if step_argument
197
- case step_argument[:type]
198
- when :DocString
199
- adapt_doc_string!(step_argument)
200
- parsed_step['doc_string'] = parsed_step.delete(:argument)
201
- when :DataTable
202
- adapt_step_table!(step_argument)
203
- parsed_step['table'] = parsed_step.delete(:argument)
204
- else
205
- raise(ArgumentError, "Unknown step argument type: #{step_argument[:type]}")
206
- end
207
- end
208
- end
209
-
210
- # Adapts the AST sub-tree that is rooted at the given doc string node.
211
- def adapt_doc_string!(parsed_doc_string)
212
- # Saving off the original data
213
- parsed_doc_string['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_doc_string))
214
-
215
- parsed_doc_string['value'] = parsed_doc_string.delete(:content)
216
- parsed_doc_string['content_type'] = parsed_doc_string.delete(:contentType)
217
- parsed_doc_string['line'] = parsed_doc_string.delete(:location)[:line]
218
- end
219
-
220
- # Adapts the AST sub-tree that is rooted at the given table node.
221
- def adapt_step_table!(parsed_step_table)
222
- # Saving off the original data
223
- parsed_step_table['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step_table))
224
-
225
- # Removing parsed data for child elements in order to avoid duplicating data
226
- parsed_step_table['cuke_modeler_parsing_data'][:rows] = nil
227
-
228
- parsed_step_table['rows'] = []
229
- parsed_step_table[:rows].each do |row|
230
- adapt_table_row!(row)
231
- end
232
- parsed_step_table['rows'].concat(parsed_step_table.delete(:rows))
233
- parsed_step_table['line'] = parsed_step_table.delete(:location)[:line]
234
- end
235
-
236
- # Adapts the AST sub-tree that is rooted at the given row node.
237
- def adapt_table_row!(parsed_table_row)
238
- # Saving off the original data
239
- parsed_table_row['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_table_row))
240
-
241
- # Removing parsed data for child elements in order to avoid duplicating data which the child elements will themselves include
242
- parsed_table_row['cuke_modeler_parsing_data'][:cells] = nil
243
-
244
-
245
- parsed_table_row['line'] = parsed_table_row.delete(:location)[:line]
246
-
247
- parsed_table_row['cells'] = []
248
- parsed_table_row[:cells].each do |row|
249
- adapt_table_cell!(row)
250
- end
251
- parsed_table_row['cells'].concat(parsed_table_row.delete(:cells))
252
- end
253
-
254
- # Adapts the AST sub-tree that is rooted at the given cell node.
255
- def adapt_table_cell!(parsed_cell)
256
- # Saving off the original data
257
- parsed_cell['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_cell))
258
-
259
- parsed_cell['value'] = parsed_cell.delete(:value)
260
- parsed_cell['line'] = parsed_cell.delete(:location)[:line]
261
- end
262
-
263
-
264
- private
265
-
266
-
267
- def adapt_child_elements!(parsed_feature)
268
- adapt_background!(parsed_feature[:background]) if parsed_feature[:background]
269
- adapt_tests!(parsed_feature)
270
- end
271
-
272
- def adapt_tests!(parsed_feature)
273
- parsed_feature[:scenarioDefinitions].each do |test|
274
- adapt_test!(test)
275
- end
276
- end
277
-
278
- def adapt_test!(parsed_test)
279
- # Saving off the original data
280
- parsed_test['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_test))
281
-
282
- parsed_test['keyword'] = parsed_test.delete(:keyword)
283
- parsed_test['type'] = parsed_test.delete(:type).to_s
284
-
285
- case parsed_test['type']
286
- when 'Scenario'
287
- adapt_scenario!(parsed_test)
288
- when 'ScenarioOutline'
289
- adapt_outline!(parsed_test)
290
- else
291
- raise(ArgumentError, "Unknown test type: #{parsed_test['type']}")
292
- end
293
- end
294
-
295
- end
296
- end