cuke_modeler 1.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +329 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +25 -18
  5. data/cuke_modeler.gemspec +15 -9
  6. data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +12 -0
  7. data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +12 -0
  8. data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +12 -0
  9. data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +12 -0
  10. data/lib/cuke_modeler/adapters/{gherkin_6_adapter.rb → gherkin_9_adapter.rb} +75 -64
  11. data/lib/cuke_modeler/containing.rb +16 -0
  12. data/lib/cuke_modeler/described.rb +1 -0
  13. data/lib/cuke_modeler/models/background.rb +1 -1
  14. data/lib/cuke_modeler/models/cell.rb +1 -1
  15. data/lib/cuke_modeler/models/comment.rb +1 -1
  16. data/lib/cuke_modeler/models/directory.rb +2 -2
  17. data/lib/cuke_modeler/models/doc_string.rb +1 -1
  18. data/lib/cuke_modeler/models/example.rb +1 -1
  19. data/lib/cuke_modeler/models/feature.rb +1 -1
  20. data/lib/cuke_modeler/models/feature_file.rb +2 -2
  21. data/lib/cuke_modeler/models/outline.rb +1 -1
  22. data/lib/cuke_modeler/models/row.rb +1 -1
  23. data/lib/cuke_modeler/models/scenario.rb +1 -1
  24. data/lib/cuke_modeler/models/step.rb +32 -3
  25. data/lib/cuke_modeler/models/table.rb +1 -1
  26. data/lib/cuke_modeler/models/tag.rb +1 -1
  27. data/lib/cuke_modeler/named.rb +1 -0
  28. data/lib/cuke_modeler/nested.rb +1 -0
  29. data/lib/cuke_modeler/parsed.rb +1 -0
  30. data/lib/cuke_modeler/parsing.rb +88 -92
  31. data/lib/cuke_modeler/sourceable.rb +1 -0
  32. data/lib/cuke_modeler/stepped.rb +1 -0
  33. data/lib/cuke_modeler/taggable.rb +1 -0
  34. data/lib/cuke_modeler/version.rb +1 -1
  35. data/testing/cucumber/features/analysis/step_comparison.feature +25 -0
  36. data/testing/cucumber/features/analysis/test_comparison.feature +1 -1
  37. metadata +55 -142
  38. data/.gitignore +0 -18
  39. data/.simplecov +0 -7
  40. data/.travis.yml +0 -54
  41. data/Gemfile +0 -36
  42. data/History.md +0 -191
  43. data/Rakefile +0 -63
  44. data/appveyor.yml +0 -43
  45. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +0 -273
  46. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +0 -296
  47. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +0 -308
  48. data/testing/cucumber/step_definitions/action_steps.rb +0 -13
  49. data/testing/cucumber/step_definitions/background_steps.rb +0 -1
  50. data/testing/cucumber/step_definitions/directory_steps.rb +0 -6
  51. data/testing/cucumber/step_definitions/doc_string_steps.rb +0 -1
  52. data/testing/cucumber/step_definitions/feature_file_steps.rb +0 -16
  53. data/testing/cucumber/step_definitions/feature_steps.rb +0 -7
  54. data/testing/cucumber/step_definitions/modeling_steps.rb +0 -44
  55. data/testing/cucumber/step_definitions/setup_steps.rb +0 -32
  56. data/testing/cucumber/step_definitions/step_steps.rb +0 -3
  57. data/testing/cucumber/step_definitions/table_steps.rb +0 -1
  58. data/testing/cucumber/step_definitions/tag_steps.rb +0 -3
  59. data/testing/cucumber/step_definitions/verification_steps.rb +0 -173
  60. data/testing/cucumber/support/env.rb +0 -30
  61. data/testing/dialect_helper.rb +0 -48
  62. data/testing/file_helper.rb +0 -47
  63. data/testing/gemfiles/gherkin2.gemfile +0 -32
  64. data/testing/gemfiles/gherkin3.gemfile +0 -26
  65. data/testing/gemfiles/gherkin4.gemfile +0 -27
  66. data/testing/gemfiles/gherkin5.gemfile +0 -26
  67. data/testing/gemfiles/gherkin6.gemfile +0 -10
  68. data/testing/rspec/spec/integration/background_integration_spec.rb +0 -442
  69. data/testing/rspec/spec/integration/cell_integration_spec.rb +0 -335
  70. data/testing/rspec/spec/integration/comment_integration_spec.rb +0 -177
  71. data/testing/rspec/spec/integration/directory_integration_spec.rb +0 -218
  72. data/testing/rspec/spec/integration/doc_string_integration_spec.rb +0 -402
  73. data/testing/rspec/spec/integration/example_integration_spec.rb +0 -741
  74. data/testing/rspec/spec/integration/feature_file_integration_spec.rb +0 -272
  75. data/testing/rspec/spec/integration/feature_integration_spec.rb +0 -650
  76. data/testing/rspec/spec/integration/gherkin_2_adapter_spec.rb +0 -166
  77. data/testing/rspec/spec/integration/gherkin_3_adapter_spec.rb +0 -166
  78. data/testing/rspec/spec/integration/gherkin_4_adapter_spec.rb +0 -165
  79. data/testing/rspec/spec/integration/gherkin_6_adapter_spec.rb +0 -166
  80. data/testing/rspec/spec/integration/model_integration_spec.rb +0 -15
  81. data/testing/rspec/spec/integration/nested_integration_spec.rb +0 -91
  82. data/testing/rspec/spec/integration/outline_integration_spec.rb +0 -624
  83. data/testing/rspec/spec/integration/parsing_integration_spec.rb +0 -117
  84. data/testing/rspec/spec/integration/row_integration_spec.rb +0 -291
  85. data/testing/rspec/spec/integration/scenario_integration_spec.rb +0 -479
  86. data/testing/rspec/spec/integration/shared/models_integration_specs.rb +0 -18
  87. data/testing/rspec/spec/integration/step_integration_spec.rb +0 -475
  88. data/testing/rspec/spec/integration/table_integration_spec.rb +0 -337
  89. data/testing/rspec/spec/integration/tag_integration_spec.rb +0 -259
  90. data/testing/rspec/spec/spec_helper.rb +0 -122
  91. data/testing/rspec/spec/unit/background_unit_spec.rb +0 -83
  92. data/testing/rspec/spec/unit/cell_unit_spec.rb +0 -68
  93. data/testing/rspec/spec/unit/comment_unit_spec.rb +0 -68
  94. data/testing/rspec/spec/unit/described_unit_spec.rb +0 -23
  95. data/testing/rspec/spec/unit/directory_unit_spec.rb +0 -127
  96. data/testing/rspec/spec/unit/doc_string_unit_spec.rb +0 -100
  97. data/testing/rspec/spec/unit/example_unit_spec.rb +0 -133
  98. data/testing/rspec/spec/unit/feature_file_unit_spec.rb +0 -125
  99. data/testing/rspec/spec/unit/feature_unit_spec.rb +0 -157
  100. data/testing/rspec/spec/unit/model_unit_spec.rb +0 -15
  101. data/testing/rspec/spec/unit/named_unit_spec.rb +0 -23
  102. data/testing/rspec/spec/unit/nested_unit_spec.rb +0 -43
  103. data/testing/rspec/spec/unit/outline_unit_spec.rb +0 -117
  104. data/testing/rspec/spec/unit/parsed_unit_spec.rb +0 -27
  105. data/testing/rspec/spec/unit/parsing_unit_spec.rb +0 -54
  106. data/testing/rspec/spec/unit/row_unit_spec.rb +0 -68
  107. data/testing/rspec/spec/unit/scenario_unit_spec.rb +0 -86
  108. data/testing/rspec/spec/unit/shared/bare_bones_models_unit_specs.rb +0 -14
  109. data/testing/rspec/spec/unit/shared/containing_models_unit_specs.rb +0 -25
  110. data/testing/rspec/spec/unit/shared/described_models_unit_specs.rb +0 -38
  111. data/testing/rspec/spec/unit/shared/keyworded_models_unit_specs.rb +0 -58
  112. data/testing/rspec/spec/unit/shared/models_unit_specs.rb +0 -15
  113. data/testing/rspec/spec/unit/shared/named_models_unit_specs.rb +0 -39
  114. data/testing/rspec/spec/unit/shared/nested_models_unit_specs.rb +0 -51
  115. data/testing/rspec/spec/unit/shared/parsed_models_unit_specs.rb +0 -39
  116. data/testing/rspec/spec/unit/shared/prepopulated_models_unit_specs.rb +0 -18
  117. data/testing/rspec/spec/unit/shared/sourced_models_unit_specs.rb +0 -39
  118. data/testing/rspec/spec/unit/shared/stepped_models_unit_specs.rb +0 -46
  119. data/testing/rspec/spec/unit/shared/stringifiable_models_unit_specs.rb +0 -18
  120. data/testing/rspec/spec/unit/shared/tagged_models_unit_specs.rb +0 -72
  121. data/testing/rspec/spec/unit/sourceable_unit_spec.rb +0 -27
  122. data/testing/rspec/spec/unit/step_unit_spec.rb +0 -109
  123. data/testing/rspec/spec/unit/stepped_unit_spec.rb +0 -23
  124. data/testing/rspec/spec/unit/table_unit_spec.rb +0 -77
  125. data/testing/rspec/spec/unit/tag_unit_spec.rb +0 -68
  126. data/testing/rspec/spec/unit/taggable_unit_spec.rb +0 -69
  127. data/testing/test_languages.json +0 -45
  128. data/todo.txt +0 -24
@@ -0,0 +1,12 @@
1
+ require_relative 'gherkin_9_adapter'
2
+
3
+
4
+ module CukeModeler
5
+
6
+ # NOT A PART OF THE PUBLIC API
7
+ # An adapter that can convert the output of version 10.x of the *cucumber-gherkin* gem into input that is consumable by this gem.
8
+
9
+ class Gherkin10Adapter < Gherkin9Adapter
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'gherkin_9_adapter'
2
+
3
+
4
+ module CukeModeler
5
+
6
+ # NOT A PART OF THE PUBLIC API
7
+ # An adapter that can convert the output of version 11.x of the *cucumber-gherkin* gem into input that is consumable by this gem.
8
+
9
+ class Gherkin11Adapter < Gherkin9Adapter
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'gherkin_9_adapter'
2
+
3
+
4
+ module CukeModeler
5
+
6
+ # NOT A PART OF THE PUBLIC API
7
+ # An adapter that can convert the output of version 12.x of the *cucumber-gherkin* gem into input that is consumable by this gem.
8
+
9
+ class Gherkin12Adapter < Gherkin9Adapter
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'gherkin_9_adapter'
2
+
3
+
4
+ module CukeModeler
5
+
6
+ # NOT A PART OF THE PUBLIC API
7
+ # An adapter that can convert the output of version 13.x of the *cucumber-gherkin* gem into input that is consumable by this gem.
8
+
9
+ class Gherkin13Adapter < Gherkin9Adapter
10
+
11
+ end
12
+ end
@@ -1,8 +1,9 @@
1
1
  module CukeModeler
2
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.
3
+ # NOT A PART OF THE PUBLIC API
4
+ # An adapter that can convert the output of version 9.x of the *cucumber-gherkin* gem into input that is consumable by this gem.
4
5
 
5
- class Gherkin6Adapter
6
+ class Gherkin9Adapter
6
7
 
7
8
  # Adapts the given AST into the shape that this gem expects
8
9
  def adapt(parsed_ast)
@@ -10,20 +11,21 @@ module CukeModeler
10
11
  parsed_ast['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_ast))
11
12
 
12
13
  # 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
14
+ parsed_ast['cuke_modeler_parsing_data'][:feature] = nil if parsed_ast['cuke_modeler_parsing_data'][:feature]
15
+ parsed_ast['cuke_modeler_parsing_data'][:comments] = nil if parsed_ast['cuke_modeler_parsing_data'][:comments]
15
16
 
16
- # Comments are stored on the feature file in gherkin 4.x
17
17
  parsed_ast['comments'] = []
18
- parsed_ast[:comments].each do |comment|
19
- adapt_comment!(comment)
18
+ if parsed_ast[:comments]
19
+ parsed_ast[:comments].each do |comment|
20
+ adapt_comment!(comment)
21
+ end
22
+ parsed_ast['comments'].concat(parsed_ast.delete(:comments))
20
23
  end
21
- parsed_ast['comments'].concat(parsed_ast.delete(:comments))
22
24
 
23
25
  adapt_feature!(parsed_ast[:feature]) if parsed_ast[:feature]
24
26
  parsed_ast['feature'] = parsed_ast.delete(:feature)
25
27
 
26
- [parsed_ast]
28
+ parsed_ast
27
29
  end
28
30
 
29
31
  # Adapts the AST sub-tree that is rooted at the given feature node.
@@ -32,23 +34,27 @@ module CukeModeler
32
34
  parsed_feature['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_feature))
33
35
 
34
36
  # 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
+ parsed_feature['cuke_modeler_parsing_data'][:tags] = nil if parsed_feature['cuke_modeler_parsing_data'][:tags]
38
+ parsed_feature['cuke_modeler_parsing_data'][:children] = nil if parsed_feature['cuke_modeler_parsing_data'][:children]
37
39
 
38
40
  parsed_feature['keyword'] = parsed_feature.delete(:keyword)
39
41
  parsed_feature['name'] = parsed_feature.delete(:name)
40
- parsed_feature['description'] = parsed_feature.delete(:description)
42
+ parsed_feature['description'] = parsed_feature.delete(:description) || ''
41
43
  parsed_feature['line'] = parsed_feature.delete(:location)[:line]
42
44
 
43
45
  parsed_feature['elements'] = []
44
- adapt_child_elements!(parsed_feature[:children])
45
- parsed_feature['elements'].concat(parsed_feature.delete(:children))
46
+ if parsed_feature[:children]
47
+ adapt_child_elements!(parsed_feature[:children])
48
+ parsed_feature['elements'].concat(parsed_feature.delete(:children))
49
+ end
46
50
 
47
51
  parsed_feature['tags'] = []
48
- parsed_feature[:tags].each do |tag|
49
- adapt_tag!(tag)
52
+ if parsed_feature[:tags]
53
+ parsed_feature[:tags].each do |tag|
54
+ adapt_tag!(tag)
55
+ end
56
+ parsed_feature['tags'].concat(parsed_feature.delete(:tags))
50
57
  end
51
- parsed_feature['tags'].concat(parsed_feature.delete(:tags))
52
58
  end
53
59
 
54
60
  # Adapts the AST sub-tree that is rooted at the given background node.
@@ -57,76 +63,88 @@ module CukeModeler
57
63
  parsed_background['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_background))
58
64
 
59
65
  # Removing parsed data for child elements in order to avoid duplicating data
60
- parsed_background['cuke_modeler_parsing_data'][:background][:steps] = nil
66
+ parsed_background['cuke_modeler_parsing_data'][:background][:steps] = nil if parsed_background['cuke_modeler_parsing_data'][:background][:steps]
61
67
 
62
68
  parsed_background['type'] = 'Background'
63
69
  parsed_background['keyword'] = parsed_background[:background].delete(:keyword)
64
70
  parsed_background['name'] = parsed_background[:background].delete(:name)
65
- parsed_background['description'] = parsed_background[:background].delete(:description)
71
+ parsed_background['description'] = parsed_background[:background].delete(:description) || ''
66
72
  parsed_background['line'] = parsed_background[:background].delete(:location)[:line]
67
73
 
68
74
  parsed_background['steps'] = []
69
- parsed_background[:background][:steps].each do |step|
70
- adapt_step!(step)
75
+ if parsed_background[:background][:steps]
76
+ parsed_background[:background][:steps].each do |step|
77
+ adapt_step!(step)
78
+ end
79
+ parsed_background['steps'].concat(parsed_background[:background].delete(:steps))
71
80
  end
72
- parsed_background['steps'].concat(parsed_background[:background].delete(:steps))
73
81
  end
74
82
 
75
83
  # Adapts the AST sub-tree that is rooted at the given scenario node.
76
84
  def adapt_scenario!(parsed_test)
77
85
  # 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
86
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:tags] = nil if parsed_test['cuke_modeler_parsing_data'][:scenario][:tags]
87
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:steps] = nil if parsed_test['cuke_modeler_parsing_data'][:scenario][:steps]
80
88
 
81
89
  parsed_test['type'] = 'Scenario'
82
90
  parsed_test['keyword'] = parsed_test[:scenario].delete(:keyword)
83
91
  parsed_test['name'] = parsed_test[:scenario].delete(:name)
84
- parsed_test['description'] = parsed_test[:scenario].delete(:description)
92
+ parsed_test['description'] = parsed_test[:scenario].delete(:description) || ''
85
93
  parsed_test['line'] = parsed_test[:scenario].delete(:location)[:line]
86
94
 
87
95
  parsed_test['tags'] = []
88
- parsed_test[:scenario][:tags].each do |tag|
89
- adapt_tag!(tag)
96
+ if parsed_test[:scenario][:tags]
97
+ parsed_test[:scenario][:tags].each do |tag|
98
+ adapt_tag!(tag)
99
+ end
100
+ parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
90
101
  end
91
- parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
92
102
 
93
103
  parsed_test['steps'] = []
94
- parsed_test[:scenario][:steps].each do |step|
95
- adapt_step!(step)
104
+ if parsed_test[:scenario][:steps]
105
+ parsed_test[:scenario][:steps].each do |step|
106
+ adapt_step!(step)
107
+ end
108
+ parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
96
109
  end
97
- parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
98
110
  end
99
111
 
100
112
  # Adapts the AST sub-tree that is rooted at the given outline node.
101
113
  def adapt_outline!(parsed_test)
102
114
  # 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
115
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:tags] = nil if parsed_test['cuke_modeler_parsing_data'][:scenario][:tags]
116
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:steps] = nil if parsed_test['cuke_modeler_parsing_data'][:scenario][:steps]
117
+ parsed_test['cuke_modeler_parsing_data'][:scenario][:examples] = nil if parsed_test['cuke_modeler_parsing_data'][:scenario][:examples]
106
118
 
107
119
  parsed_test['type'] = 'ScenarioOutline'
108
120
  parsed_test['keyword'] = parsed_test[:scenario].delete(:keyword)
109
121
  parsed_test['name'] = parsed_test[:scenario].delete(:name)
110
- parsed_test['description'] = parsed_test[:scenario].delete(:description)
122
+ parsed_test['description'] = parsed_test[:scenario].delete(:description) || ''
111
123
  parsed_test['line'] = parsed_test[:scenario].delete(:location)[:line]
112
124
 
113
125
  parsed_test['tags'] = []
114
- parsed_test[:scenario][:tags].each do |tag|
115
- adapt_tag!(tag)
126
+ if parsed_test[:scenario][:tags]
127
+ parsed_test[:scenario][:tags].each do |tag|
128
+ adapt_tag!(tag)
129
+ end
130
+ parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
116
131
  end
117
- parsed_test['tags'].concat(parsed_test[:scenario].delete(:tags))
118
132
 
119
133
  parsed_test['steps'] = []
120
- parsed_test[:scenario][:steps].each do |step|
121
- adapt_step!(step)
134
+ if parsed_test[:scenario][:steps]
135
+ parsed_test[:scenario][:steps].each do |step|
136
+ adapt_step!(step)
137
+ end
138
+ parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
122
139
  end
123
- parsed_test['steps'].concat(parsed_test[:scenario].delete(:steps))
124
140
 
125
141
  parsed_test['examples'] = []
126
- parsed_test[:scenario][:examples].each do |step|
127
- adapt_example!(step)
142
+ if parsed_test[:scenario][:examples]
143
+ parsed_test[:scenario][:examples].each do |step|
144
+ adapt_example!(step)
145
+ end
146
+ parsed_test['examples'].concat(parsed_test[:scenario].delete(:examples))
128
147
  end
129
- parsed_test['examples'].concat(parsed_test[:scenario].delete(:examples))
130
148
  end
131
149
 
132
150
  # Adapts the AST sub-tree that is rooted at the given example node.
@@ -135,14 +153,14 @@ module CukeModeler
135
153
  parsed_example['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_example))
136
154
 
137
155
  # 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
156
+ parsed_example['cuke_modeler_parsing_data'][:tags] = nil if parsed_example['cuke_modeler_parsing_data'][:tags]
157
+ parsed_example['cuke_modeler_parsing_data'][:table_header] = nil if parsed_example['cuke_modeler_parsing_data'][:table_header]
158
+ parsed_example['cuke_modeler_parsing_data'][:table_body] = nil if parsed_example['cuke_modeler_parsing_data'][:table_body]
141
159
 
142
160
  parsed_example['keyword'] = parsed_example.delete(:keyword)
143
161
  parsed_example['name'] = parsed_example.delete(:name)
144
162
  parsed_example['line'] = parsed_example.delete(:location)[:line]
145
- parsed_example['description'] = parsed_example.delete(:description)
163
+ parsed_example['description'] = parsed_example.delete(:description) || ''
146
164
 
147
165
  parsed_example['rows'] = []
148
166
 
@@ -152,19 +170,19 @@ module CukeModeler
152
170
  end
153
171
 
154
172
  if parsed_example[:table_body]
155
-
156
173
  parsed_example[:table_body].each do |row|
157
174
  adapt_table_row!(row)
158
175
  end
159
176
  parsed_example['rows'].concat(parsed_example.delete(:table_body))
160
177
  end
161
178
 
162
-
163
179
  parsed_example['tags'] = []
164
- parsed_example[:tags].each do |tag|
165
- adapt_tag!(tag)
180
+ if parsed_example[:tags]
181
+ parsed_example[:tags].each do |tag|
182
+ adapt_tag!(tag)
183
+ end
184
+ parsed_example['tags'].concat(parsed_example.delete(:tags))
166
185
  end
167
- parsed_example['tags'].concat(parsed_example.delete(:tags))
168
186
  end
169
187
 
170
188
  # Adapts the AST sub-tree that is rooted at the given tag node.
@@ -191,14 +209,13 @@ module CukeModeler
191
209
  parsed_step['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_step))
192
210
 
193
211
  # 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
212
+ parsed_step['cuke_modeler_parsing_data'][:data_table] = nil if parsed_step['cuke_modeler_parsing_data'][:data_table]
213
+ parsed_step['cuke_modeler_parsing_data'][:doc_string] = nil if parsed_step['cuke_modeler_parsing_data'][:doc_string]
196
214
 
197
215
  parsed_step['keyword'] = parsed_step.delete(:keyword)
198
216
  parsed_step['name'] = parsed_step.delete(:text)
199
217
  parsed_step['line'] = parsed_step.delete(:location)[:line]
200
218
 
201
-
202
219
  case
203
220
  when parsed_step[:doc_string]
204
221
  adapt_doc_string!(parsed_step[:doc_string])
@@ -217,7 +234,7 @@ module CukeModeler
217
234
  parsed_doc_string['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_doc_string))
218
235
 
219
236
  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
237
+ parsed_doc_string['content_type'] = parsed_doc_string.delete(:media_type)
221
238
  parsed_doc_string['line'] = parsed_doc_string.delete(:location)[:line]
222
239
  end
223
240
 
@@ -245,7 +262,6 @@ module CukeModeler
245
262
  # Removing parsed data for child elements in order to avoid duplicating data which the child elements will themselves include
246
263
  parsed_table_row['cuke_modeler_parsing_data'][:cells] = nil
247
264
 
248
-
249
265
  parsed_table_row['line'] = parsed_table_row.delete(:location)[:line]
250
266
 
251
267
  parsed_table_row['cells'] = []
@@ -269,8 +285,6 @@ module CukeModeler
269
285
 
270
286
 
271
287
  def adapt_child_elements!(parsed_children)
272
- return if parsed_children.empty?
273
-
274
288
  background_child = parsed_children.find { |child| child[:background] }
275
289
 
276
290
  if background_child
@@ -283,8 +297,6 @@ module CukeModeler
283
297
  end
284
298
 
285
299
  def adapt_tests!(parsed_tests)
286
- return unless parsed_tests
287
-
288
300
  parsed_tests.each do |test|
289
301
  adapt_test!(test)
290
302
  end
@@ -294,9 +306,8 @@ module CukeModeler
294
306
  # Saving off the original data
295
307
  parsed_test['cuke_modeler_parsing_data'] = Marshal::load(Marshal.dump(parsed_test))
296
308
 
297
-
298
309
  case
299
- when parsed_test[:scenario] && parsed_test[:scenario][:examples].any?
310
+ when (parsed_test[:scenario] && parsed_test[:scenario][:examples]) || (parsed_test[:scenario] && Parsing.dialects[Parsing.dialect]['scenarioOutline'].include?(parsed_test[:scenario][:keyword]))
300
311
  adapt_outline!(parsed_test)
301
312
  when parsed_test[:scenario]
302
313
  adapt_scenario!(parsed_test)
@@ -1,9 +1,25 @@
1
1
  module CukeModeler
2
2
 
3
+ # NOT A PART OF THE PUBLIC API
3
4
  # A mix-in module containing methods used by models that contain other models.
4
5
 
5
6
  module Containing
6
7
 
8
+ # Executes the given code block with every model that is a child of this model.
9
+ def each_descendant(&block)
10
+ children.each do |child_model|
11
+ block.call(child_model)
12
+ child_model.each_descendant(&block) if child_model.respond_to?(:each_descendant)
13
+ end
14
+ end
15
+
16
+ # Executes the given code block with this model and every model that is a child of this model.
17
+ def each_model(&block)
18
+ block.call(self)
19
+
20
+ each_descendant(&block)
21
+ end
22
+
7
23
 
8
24
  private
9
25
 
@@ -1,5 +1,6 @@
1
1
  module CukeModeler
2
2
 
3
+ # NOT A PART OF THE PUBLIC API
3
4
  # A mix-in module containing methods used by models that represent an element that has a description.
4
5
 
5
6
  module Described
@@ -64,7 +64,7 @@ module CukeModeler
64
64
 
65
65
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_background.feature')
66
66
 
67
- parsed_file.first['feature']['elements'].first
67
+ parsed_file['feature']['elements'].first
68
68
  end
69
69
 
70
70
  end
@@ -41,7 +41,7 @@ module CukeModeler
41
41
 
42
42
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_cell.feature')
43
43
 
44
- parsed_file.first['feature']['elements'].first['steps'].first['table']['rows'].first['cells'].first
44
+ parsed_file['feature']['elements'].first['steps'].first['table']['rows'].first['cells'].first
45
45
  end
46
46
 
47
47
  end
@@ -40,7 +40,7 @@ module CukeModeler
40
40
 
41
41
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_comment.feature')
42
42
 
43
- parsed_file.first['comments'].last
43
+ parsed_file['comments'].last
44
44
  end
45
45
 
46
46
  end
@@ -82,8 +82,8 @@ module CukeModeler
82
82
  def process_feature_file(file_path)
83
83
  source_text = IO.read(file_path)
84
84
 
85
- feature_file_data = Parsing::parse_text(source_text, file_path).first
86
- feature_file_data = feature_file_data.merge({'path' => file_path})
85
+ feature_file_data = Parsing::parse_text(source_text, file_path)
86
+ feature_file_data = feature_file_data.merge({ 'path' => file_path })
87
87
 
88
88
  feature_file_data
89
89
  end
@@ -45,7 +45,7 @@ module CukeModeler
45
45
 
46
46
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_doc_string.feature')
47
47
 
48
- parsed_file.first['feature']['elements'].first['steps'].first['doc_string']
48
+ parsed_file['feature']['elements'].first['steps'].first['doc_string']
49
49
  end
50
50
 
51
51
  def content_type_output_string
@@ -124,7 +124,7 @@ module CukeModeler
124
124
 
125
125
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_example.feature')
126
126
 
127
- parsed_file.first['feature']['elements'].first['examples'].first
127
+ parsed_file['feature']['elements'].first['examples'].first
128
128
  end
129
129
 
130
130
  def determine_buffer_size(index)
@@ -90,7 +90,7 @@ module CukeModeler
90
90
  def parse_source(source_text)
91
91
  parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_feature.feature')
92
92
 
93
- parsed_file.first['feature']
93
+ parsed_file['feature']
94
94
  end
95
95
 
96
96
  def background_output_string