cuke_modeler 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +23 -0
- data/Gemfile +22 -4
- data/History.rdoc +6 -0
- data/Rakefile +26 -26
- data/cuke_modeler.gemspec +3 -1
- data/features/modeling/{background_modeling.feature → gherkin/background_modeling.feature} +1 -11
- data/features/modeling/{background_output.feature → gherkin/background_output.feature} +1 -0
- data/features/modeling/{directory_modeling.feature → gherkin/directory_modeling.feature} +1 -11
- data/features/modeling/{directory_output.feature → gherkin/directory_output.feature} +1 -0
- data/features/modeling/{doc_string_modeling.feature → gherkin/doc_string_modeling.feature} +1 -11
- data/features/modeling/{doc_string_output.feature → gherkin/doc_string_output.feature} +1 -0
- data/features/modeling/{example_modeling.feature → gherkin/example_modeling.feature} +1 -11
- data/features/modeling/{example_output.feature → gherkin/example_output.feature} +1 -0
- data/features/modeling/{feature_file_modeling.feature → gherkin/feature_file_modeling.feature} +1 -11
- data/features/modeling/{feature_file_output.feature → gherkin/feature_file_output.feature} +1 -0
- data/features/modeling/{feature_modeling.feature → gherkin/feature_modeling.feature} +1 -11
- data/features/modeling/{feature_output.feature → gherkin/feature_output.feature} +1 -0
- data/features/modeling/{outline_modeling.feature → gherkin/outline_modeling.feature} +1 -11
- data/features/modeling/{outline_output.feature → gherkin/outline_output.feature} +1 -0
- data/features/modeling/{row_modeling.feature → gherkin/row_modeling.feature} +1 -10
- data/features/modeling/{row_output.feature → gherkin/row_output.feature} +1 -0
- data/features/modeling/{scenario_modeling.feature → gherkin/scenario_modeling.feature} +1 -11
- data/features/modeling/{scenario_output.feature → gherkin/scenario_output.feature} +1 -0
- data/features/modeling/{step_modeling.feature → gherkin/step_modeling.feature} +1 -11
- data/features/modeling/{step_output.feature → gherkin/step_output.feature} +1 -0
- data/features/modeling/{table_modeling.feature → gherkin/table_modeling.feature} +1 -11
- data/features/modeling/{table_output.feature → gherkin/table_output.feature} +1 -0
- data/features/modeling/{table_row_modeling.feature → gherkin/table_row_modeling.feature} +1 -11
- data/features/modeling/{table_row_output.feature → gherkin/table_row_output.feature} +1 -0
- data/features/modeling/{tag_modeling.feature → gherkin/tag_modeling.feature} +1 -11
- data/features/modeling/{tag_output.feature → gherkin/tag_output.feature} +1 -0
- data/features/modeling/gherkin3/background_modeling.feature +64 -0
- data/features/modeling/gherkin3/background_output.feature +131 -0
- data/features/modeling/gherkin3/directory_modeling.feature +110 -0
- data/features/modeling/gherkin3/directory_output.feature +14 -0
- data/features/modeling/gherkin3/doc_string_modeling.feature +53 -0
- data/features/modeling/gherkin3/doc_string_output.feature +72 -0
- data/features/modeling/gherkin3/example_modeling.feature +100 -0
- data/features/modeling/gherkin3/example_output.feature +207 -0
- data/features/modeling/gherkin3/feature_file_modeling.feature +54 -0
- data/features/modeling/gherkin3/feature_file_output.feature +14 -0
- data/features/modeling/gherkin3/feature_modeling.feature +155 -0
- data/features/modeling/gherkin3/feature_output.feature +249 -0
- data/features/modeling/gherkin3/outline_modeling.feature +89 -0
- data/features/modeling/gherkin3/outline_output.feature +255 -0
- data/features/modeling/gherkin3/row_modeling.feature +68 -0
- data/features/modeling/gherkin3/row_output.feature +28 -0
- data/features/modeling/gherkin3/scenario_modeling.feature +78 -0
- data/features/modeling/gherkin3/scenario_output.feature +148 -0
- data/features/modeling/gherkin3/step_modeling.feature +75 -0
- data/features/modeling/gherkin3/step_output.feature +53 -0
- data/features/modeling/gherkin3/table_modeling.feature +42 -0
- data/features/modeling/gherkin3/table_output.feature +43 -0
- data/features/modeling/gherkin3/table_row_modeling.feature +57 -0
- data/features/modeling/gherkin3/table_row_output.feature +28 -0
- data/features/modeling/gherkin3/tag_modeling.feature +49 -0
- data/features/modeling/gherkin3/tag_output.feature +17 -0
- data/features/step_definitions/background_steps.rb +5 -1
- data/features/step_definitions/doc_string_steps.rb +5 -1
- data/features/step_definitions/feature_steps.rb +5 -1
- data/features/step_definitions/outline_steps.rb +10 -4
- data/features/step_definitions/step_steps.rb +10 -2
- data/features/step_definitions/table_steps.rb +6 -2
- data/features/step_definitions/tag_steps.rb +15 -3
- data/features/step_definitions/test_steps.rb +7 -2
- data/features/support/env.rb +21 -9
- data/gemfiles/gherkin.gemfile +17 -0
- data/gemfiles/gherkin3.gemfile +15 -0
- data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +146 -0
- data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +206 -0
- data/lib/cuke_modeler/parsing.rb +61 -20
- data/lib/cuke_modeler/raw.rb +1 -1
- data/lib/cuke_modeler/row.rb +2 -2
- data/lib/cuke_modeler/table.rb +2 -2
- data/lib/cuke_modeler/table_row.rb +1 -1
- data/lib/cuke_modeler/version.rb +1 -1
- data/spec/integration/example_integration_spec.rb +2 -1
- data/spec/integration/feature_integration_spec.rb +7 -4
- data/spec/integration/outline_integration_spec.rb +4 -2
- data/spec/integration/tag_integration_spec.rb +2 -1
- data/spec/spec_helper.rb +6 -0
- data/spec/unit/background_unit_spec.rb +17 -0
- data/spec/unit/doc_string_unit_spec.rb +17 -0
- data/spec/unit/example_unit_spec.rb +18 -1
- data/spec/unit/feature_file_unit_spec.rb +2 -2
- data/spec/unit/feature_unit_spec.rb +16 -0
- data/spec/unit/outline_unit_spec.rb +20 -1
- data/spec/unit/row_unit_spec.rb +18 -0
- data/spec/unit/scenario_unit_spec.rb +17 -0
- data/spec/unit/step_unit_spec.rb +17 -0
- data/spec/unit/table_row_unit_spec.rb +18 -0
- data/spec/unit/table_unit_spec.rb +16 -0
- data/spec/unit/tag_unit_spec.rb +17 -0
- metadata +147 -60
- data/features/step_definitions/spec_steps.rb +0 -18
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gemspec :path => "../"
|
|
4
|
+
gem "gherkin", "< 3.0.0"
|
|
5
|
+
|
|
6
|
+
# cuke_modeler can play with pretty much any version of these but they all play differently with Ruby
|
|
7
|
+
if RUBY_VERSION =~ /^1\.8/
|
|
8
|
+
gem 'cucumber', '<1.3.0'
|
|
9
|
+
gem 'mime-types', '<2.0.0'
|
|
10
|
+
gem 'rest-client', '<1.7.0'
|
|
11
|
+
elsif RUBY_VERSION =~ /^1\./
|
|
12
|
+
gem 'cucumber', '>=1.0.0', '<2.0.0'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
if RUBY_VERSION =~ /^2\.[23456789]/
|
|
16
|
+
gem 'test-unit'
|
|
17
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gemspec :path => "../"
|
|
4
|
+
gem "gherkin", ">= 3.0.0"
|
|
5
|
+
|
|
6
|
+
# cuke_modeler can play with pretty much any version of these but they all play differently with Ruby
|
|
7
|
+
if RUBY_VERSION =~ /^1\.8/
|
|
8
|
+
gem 'cucumber', '<1.3.0'
|
|
9
|
+
gem 'mime-types', '<2.0.0'
|
|
10
|
+
gem 'rest-client', '<1.7.0'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
if RUBY_VERSION =~ /^2\.[23456789]/
|
|
14
|
+
gem 'test-unit'
|
|
15
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
class Gherkin2Adapter
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def adapt(parsed_ast)
|
|
6
|
+
# An AST is just one feature
|
|
7
|
+
adapt_feature!(parsed_ast.first) if parsed_ast.first
|
|
8
|
+
|
|
9
|
+
parsed_ast
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def adapt_feature!(parsed_feature)
|
|
13
|
+
# Saving off the original data
|
|
14
|
+
parsed_feature['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_feature))
|
|
15
|
+
|
|
16
|
+
adapt_child_elements!(parsed_feature)
|
|
17
|
+
|
|
18
|
+
if parsed_feature['tags']
|
|
19
|
+
parsed_feature['tags'].each do |tag|
|
|
20
|
+
adapt_tag!(tag)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def adapt_child_elements!(parsed_feature)
|
|
26
|
+
if parsed_feature['elements']
|
|
27
|
+
parsed_feature['elements'].each do |element|
|
|
28
|
+
case element['keyword']
|
|
29
|
+
when 'Background'
|
|
30
|
+
adapt_background!(element)
|
|
31
|
+
when 'Scenario'
|
|
32
|
+
adapt_scenario!(element)
|
|
33
|
+
when 'Scenario Outline'
|
|
34
|
+
adapt_outline!(element)
|
|
35
|
+
else
|
|
36
|
+
raise("Unknown element keyword: #{element['keyword']}")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def adapt_background!(parsed_background)
|
|
44
|
+
# Saving off the original data
|
|
45
|
+
parsed_background['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_background))
|
|
46
|
+
|
|
47
|
+
if parsed_background['steps']
|
|
48
|
+
parsed_background['steps'].each do |step|
|
|
49
|
+
adapt_step!(step)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def adapt_scenario!(parsed_scenario)
|
|
55
|
+
# Saving off the original data
|
|
56
|
+
parsed_scenario['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_scenario))
|
|
57
|
+
|
|
58
|
+
if parsed_scenario['tags']
|
|
59
|
+
parsed_scenario['tags'].each do |tag|
|
|
60
|
+
adapt_tag!(tag)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if parsed_scenario['steps']
|
|
65
|
+
parsed_scenario['steps'].each do |step|
|
|
66
|
+
adapt_step!(step)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def adapt_outline!(parsed_outline)
|
|
72
|
+
# Saving off the original data
|
|
73
|
+
parsed_outline['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_outline))
|
|
74
|
+
|
|
75
|
+
if parsed_outline['tags']
|
|
76
|
+
parsed_outline['tags'].each do |tag|
|
|
77
|
+
adapt_tag!(tag)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if parsed_outline['steps']
|
|
82
|
+
parsed_outline['steps'].each do |step|
|
|
83
|
+
adapt_step!(step)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
if parsed_outline['examples']
|
|
88
|
+
parsed_outline['examples'].each do |example|
|
|
89
|
+
adapt_example!(example)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def adapt_example!(parsed_example)
|
|
95
|
+
# Saving off the original data
|
|
96
|
+
parsed_example['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_example))
|
|
97
|
+
|
|
98
|
+
parsed_example['rows'].each do |row|
|
|
99
|
+
adapt_table_row!(row)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if parsed_example['tags']
|
|
103
|
+
parsed_example['tags'].each do |tag|
|
|
104
|
+
adapt_tag!(tag)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def adapt_tag!(parsed_tag)
|
|
110
|
+
# Saving off the original data
|
|
111
|
+
parsed_tag['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_tag))
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def adapt_step!(parsed_step)
|
|
115
|
+
# Saving off the original data
|
|
116
|
+
parsed_step['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_step))
|
|
117
|
+
|
|
118
|
+
adapt_doc_string!(parsed_step['doc_string']) if parsed_step['doc_string']
|
|
119
|
+
|
|
120
|
+
if parsed_step['rows']
|
|
121
|
+
parsed_step['rows'] = {'rows' => parsed_step['rows']}
|
|
122
|
+
adapt_step_table!(parsed_step['rows'])
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def adapt_doc_string!(parsed_doc_string)
|
|
127
|
+
# Saving off the original data
|
|
128
|
+
parsed_doc_string['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_doc_string))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def adapt_step_table!(parsed_step_table)
|
|
132
|
+
# Saving off the original data
|
|
133
|
+
parsed_step_table['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_step_table['rows']))
|
|
134
|
+
|
|
135
|
+
parsed_step_table['rows'].each do |row|
|
|
136
|
+
adapt_table_row!(row)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def adapt_table_row!(parsed_table_row)
|
|
141
|
+
# Saving off the original data
|
|
142
|
+
parsed_table_row['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_table_row))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
class Gherkin3Adapter
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def adapt(parsed_ast)
|
|
6
|
+
# An AST is just one feature
|
|
7
|
+
adapt_feature!(parsed_ast)
|
|
8
|
+
|
|
9
|
+
[parsed_ast]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def adapt_feature!(parsed_feature)
|
|
13
|
+
# Saving off the original data
|
|
14
|
+
parsed_feature['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_feature))
|
|
15
|
+
|
|
16
|
+
parsed_feature['name'] = parsed_feature.delete(:name)
|
|
17
|
+
parsed_feature['description'] = parsed_feature.delete(:description) || ''
|
|
18
|
+
parsed_feature['line'] = parsed_feature.delete(:location)[:line]
|
|
19
|
+
|
|
20
|
+
parsed_feature['elements'] = []
|
|
21
|
+
adapt_child_elements!(parsed_feature)
|
|
22
|
+
parsed_feature['elements'].concat(parsed_feature.delete(:scenarioDefinitions))
|
|
23
|
+
parsed_feature['elements'] << parsed_feature.delete(:background) if parsed_feature[:background]
|
|
24
|
+
|
|
25
|
+
parsed_feature['tags'] = []
|
|
26
|
+
parsed_feature[:tags].each do |tag|
|
|
27
|
+
adapt_tag!(tag)
|
|
28
|
+
end
|
|
29
|
+
parsed_feature['tags'].concat(parsed_feature.delete(:tags))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def adapt_child_elements!(parsed_feature)
|
|
33
|
+
adapt_background!(parsed_feature[:background]) if parsed_feature[:background]
|
|
34
|
+
adapt_tests!(parsed_feature)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def adapt_background!(parsed_background)
|
|
38
|
+
# Saving off the original data
|
|
39
|
+
parsed_background['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_background))
|
|
40
|
+
|
|
41
|
+
parsed_background['keyword'] = parsed_background.delete(:type).to_s
|
|
42
|
+
parsed_background['name'] = parsed_background.delete(:name)
|
|
43
|
+
parsed_background['description'] = parsed_background.delete(:description) || ''
|
|
44
|
+
parsed_background['line'] = parsed_background.delete(:location)[:line]
|
|
45
|
+
|
|
46
|
+
parsed_background['steps'] = []
|
|
47
|
+
parsed_background[:steps].each do |step|
|
|
48
|
+
adapt_step!(step)
|
|
49
|
+
end
|
|
50
|
+
parsed_background['steps'].concat(parsed_background.delete(:steps))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def adapt_tests!(parsed_feature)
|
|
54
|
+
parsed_feature[:scenarioDefinitions].each do |test|
|
|
55
|
+
adapt_test!(test)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def adapt_test!(parsed_test)
|
|
60
|
+
# Saving off the original data
|
|
61
|
+
parsed_test['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_test))
|
|
62
|
+
|
|
63
|
+
parsed_test['keyword'] = parsed_test.delete(:type).to_s
|
|
64
|
+
|
|
65
|
+
case parsed_test['keyword']
|
|
66
|
+
when 'Scenario'
|
|
67
|
+
adapt_scenario!(parsed_test)
|
|
68
|
+
when 'ScenarioOutline'
|
|
69
|
+
parsed_test['keyword'] = 'Scenario Outline'
|
|
70
|
+
adapt_outline!(parsed_test)
|
|
71
|
+
else
|
|
72
|
+
raise(ArgumentError, "Unknown test type: #{parsed_test['keyword']}")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def adapt_scenario!(parsed_test)
|
|
77
|
+
parsed_test['name'] = parsed_test.delete(:name)
|
|
78
|
+
parsed_test['description'] = parsed_test.delete(:description) || ''
|
|
79
|
+
parsed_test['line'] = parsed_test.delete(:location)[:line]
|
|
80
|
+
|
|
81
|
+
parsed_test['tags'] = []
|
|
82
|
+
parsed_test[:tags].each do |tag|
|
|
83
|
+
adapt_tag!(tag)
|
|
84
|
+
end
|
|
85
|
+
parsed_test['tags'].concat(parsed_test.delete(:tags))
|
|
86
|
+
|
|
87
|
+
parsed_test['steps'] = []
|
|
88
|
+
parsed_test[:steps].each do |step|
|
|
89
|
+
adapt_step!(step)
|
|
90
|
+
end
|
|
91
|
+
parsed_test['steps'].concat(parsed_test.delete(:steps))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def adapt_outline!(parsed_test)
|
|
95
|
+
parsed_test['name'] = parsed_test.delete(:name)
|
|
96
|
+
parsed_test['description'] = parsed_test.delete(:description) || ''
|
|
97
|
+
parsed_test['line'] = parsed_test.delete(:location)[:line]
|
|
98
|
+
|
|
99
|
+
parsed_test['tags'] = []
|
|
100
|
+
parsed_test[:tags].each do |tag|
|
|
101
|
+
adapt_tag!(tag)
|
|
102
|
+
end
|
|
103
|
+
parsed_test['tags'].concat(parsed_test.delete(:tags))
|
|
104
|
+
|
|
105
|
+
parsed_test['steps'] = []
|
|
106
|
+
parsed_test[:steps].each do |step|
|
|
107
|
+
adapt_step!(step)
|
|
108
|
+
end
|
|
109
|
+
parsed_test['steps'].concat(parsed_test.delete(:steps))
|
|
110
|
+
|
|
111
|
+
parsed_test['examples'] = []
|
|
112
|
+
parsed_test[:examples].each do |step|
|
|
113
|
+
adapt_example!(step)
|
|
114
|
+
end
|
|
115
|
+
parsed_test['examples'].concat(parsed_test.delete(:examples))
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def adapt_example!(parsed_example)
|
|
119
|
+
# Saving off the original data
|
|
120
|
+
parsed_example['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_example))
|
|
121
|
+
|
|
122
|
+
parsed_example['name'] = parsed_example.delete(:name)
|
|
123
|
+
parsed_example['line'] = parsed_example.delete(:location)[:line]
|
|
124
|
+
parsed_example['description'] = parsed_example.delete(:description) || ''
|
|
125
|
+
|
|
126
|
+
parsed_example['rows'] = []
|
|
127
|
+
parsed_example['rows'] << adapt_table_row!(parsed_example.delete(:tableHeader))
|
|
128
|
+
|
|
129
|
+
parsed_example[:tableBody].each do |row|
|
|
130
|
+
adapt_table_row!(row)
|
|
131
|
+
end
|
|
132
|
+
parsed_example['rows'].concat(parsed_example.delete(:tableBody))
|
|
133
|
+
|
|
134
|
+
parsed_example['tags'] = []
|
|
135
|
+
parsed_example[:tags].each do |tag|
|
|
136
|
+
adapt_tag!(tag)
|
|
137
|
+
end
|
|
138
|
+
parsed_example['tags'].concat(parsed_example.delete(:tags))
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def adapt_tag!(parsed_tag)
|
|
142
|
+
# Saving off the original data
|
|
143
|
+
parsed_tag['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_tag))
|
|
144
|
+
|
|
145
|
+
parsed_tag['name'] = parsed_tag.delete(:name)
|
|
146
|
+
parsed_tag['line'] = parsed_tag.delete(:location)[:line]
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def adapt_step!(parsed_step)
|
|
150
|
+
# Saving off the original data
|
|
151
|
+
parsed_step['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_step))
|
|
152
|
+
|
|
153
|
+
parsed_step['keyword'] = parsed_step.delete(:keyword)
|
|
154
|
+
parsed_step['name'] = parsed_step.delete(:text)
|
|
155
|
+
parsed_step['line'] = parsed_step.delete(:location)[:line]
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
step_argument = parsed_step[:argument]
|
|
159
|
+
|
|
160
|
+
if step_argument
|
|
161
|
+
case step_argument[:type]
|
|
162
|
+
when :DocString
|
|
163
|
+
adapt_doc_string!(step_argument)
|
|
164
|
+
parsed_step['doc_string'] = parsed_step.delete(:argument)
|
|
165
|
+
when :DataTable
|
|
166
|
+
adapt_step_table!(step_argument)
|
|
167
|
+
parsed_step['rows'] = parsed_step.delete(:argument)
|
|
168
|
+
else
|
|
169
|
+
raise(ArgumentError, "Unknown step argument type: #{step_argument[:type]}")
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def adapt_doc_string!(parsed_doc_string)
|
|
175
|
+
# Saving off the original data
|
|
176
|
+
parsed_doc_string['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_doc_string))
|
|
177
|
+
|
|
178
|
+
parsed_doc_string['value'] = parsed_doc_string.delete(:content)
|
|
179
|
+
parsed_doc_string['content_type'] = parsed_doc_string.delete(:contentType)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def adapt_step_table!(parsed_step_table)
|
|
183
|
+
# Saving off the original data
|
|
184
|
+
parsed_step_table['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_step_table))
|
|
185
|
+
|
|
186
|
+
parsed_step_table['rows'] = []
|
|
187
|
+
parsed_step_table[:rows].each do |row|
|
|
188
|
+
adapt_table_row!(row)
|
|
189
|
+
end
|
|
190
|
+
parsed_step_table['rows'].concat(parsed_step_table.delete(:rows))
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def adapt_table_row!(parsed_table_row)
|
|
194
|
+
# Saving off the original data
|
|
195
|
+
parsed_table_row['cuke_modeler_raw_adapter_output'] = Marshal::load(Marshal.dump(parsed_table_row))
|
|
196
|
+
|
|
197
|
+
parsed_table_row['line'] = parsed_table_row.delete(:location)[:line]
|
|
198
|
+
|
|
199
|
+
parsed_table_row['cells'] = parsed_table_row.delete(:cells).collect { |cell| cell[:value] }
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
parsed_table_row
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
end
|
data/lib/cuke_modeler/parsing.rb
CHANGED
|
@@ -1,32 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require 'gherkin'
|
|
4
|
-
|
|
5
|
-
require '
|
|
1
|
+
# The 'gherkin' gem loads differently depending across versions. Try the old one first and then the new one
|
|
2
|
+
begin
|
|
3
|
+
require 'gherkin'
|
|
4
|
+
rescue LoadError => e
|
|
5
|
+
require 'gherkin/parser'
|
|
6
|
+
end
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
# Parsing will be with an 'adapter' appropriate to the version of the 'gherkin' gem that has been activated
|
|
9
|
+
if Gem.loaded_specs['gherkin'].version.version[/^3/]
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
require 'gherkin/parser'
|
|
12
|
+
require 'cuke_modeler/adapters/gherkin_3_adapter'
|
|
10
13
|
|
|
11
|
-
module Parsing
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
module CukeModeler
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def parse_text(source_text)
|
|
18
|
-
raise(ArgumentError, "Cannot parse #{source_text.class} objects. Strings only.") unless source_text.is_a?(String)
|
|
17
|
+
module Parsing
|
|
18
|
+
class << self
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
parser = Gherkin::Parser::Parser.new(formatter)
|
|
23
|
-
parser.parse(source_text, 'fake_file.txt', 0)
|
|
24
|
-
formatter.done
|
|
20
|
+
def parse_text(source_text)
|
|
21
|
+
raise(ArgumentError, "Cannot parse #{source_text.class} objects. Strings only.") unless source_text.is_a?(String)
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
parsed_result = Gherkin::Parser.new.parse(source_text)
|
|
24
|
+
adapted_result = CukeModeler::Gherkin3Adapter.new.adapt(parsed_result)
|
|
28
25
|
|
|
26
|
+
adapted_result
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
29
|
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
else
|
|
33
|
+
|
|
34
|
+
require 'stringio'
|
|
35
|
+
require 'gherkin/formatter/json_formatter'
|
|
36
|
+
require 'gherkin'
|
|
37
|
+
require 'json'
|
|
38
|
+
require 'multi_json'
|
|
39
|
+
require 'cuke_modeler/adapters/gherkin_2_adapter'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
module CukeModeler
|
|
43
|
+
|
|
44
|
+
# A module providing source text parsing functionality.
|
|
45
|
+
|
|
46
|
+
module Parsing
|
|
30
47
|
|
|
48
|
+
class << self
|
|
49
|
+
|
|
50
|
+
# Parses the Cucumber feature given in *source_text* and returns an array
|
|
51
|
+
# containing the hash representation of its logical structure.
|
|
52
|
+
def parse_text(source_text)
|
|
53
|
+
raise(ArgumentError, "Cannot parse #{source_text.class} objects. Strings only.") unless source_text.is_a?(String)
|
|
54
|
+
|
|
55
|
+
io = StringIO.new
|
|
56
|
+
formatter = Gherkin::Formatter::JSONFormatter.new(io)
|
|
57
|
+
parser = Gherkin::Parser::Parser.new(formatter)
|
|
58
|
+
parser.parse(source_text, 'fake_file.txt', 0)
|
|
59
|
+
formatter.done
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
parsed_result = MultiJson.load(io.string)
|
|
63
|
+
adapted_result = CukeModeler::Gherkin2Adapter.new.adapt(parsed_result)
|
|
64
|
+
|
|
65
|
+
adapted_result
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
31
71
|
end
|
|
72
|
+
|
|
32
73
|
end
|