hiptest-publisher 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +98 -0
  3. data/bin/hiptest-publisher +11 -0
  4. data/lib/hiptest-publisher.rb +121 -0
  5. data/lib/hiptest-publisher/call_arguments_adder.rb +63 -0
  6. data/lib/hiptest-publisher/handlebars_helper.rb +97 -0
  7. data/lib/hiptest-publisher/nodes.rb +380 -0
  8. data/lib/hiptest-publisher/nodes_walker.rb +45 -0
  9. data/lib/hiptest-publisher/options_parser.rb +225 -0
  10. data/lib/hiptest-publisher/parameter_type_adder.rb +139 -0
  11. data/lib/hiptest-publisher/parent_adder.rb +18 -0
  12. data/lib/hiptest-publisher/render_context_maker.rb +92 -0
  13. data/lib/hiptest-publisher/renderer.rb +87 -0
  14. data/lib/hiptest-publisher/string.rb +52 -0
  15. data/lib/hiptest-publisher/utils.rb +47 -0
  16. data/lib/hiptest-publisher/xml_parser.rb +294 -0
  17. data/lib/templates/common/booleanliteral.hbs +1 -0
  18. data/lib/templates/common/dataset.hbs +0 -0
  19. data/lib/templates/common/datatable.hbs +3 -0
  20. data/lib/templates/common/nullliteral.hbs +1 -0
  21. data/lib/templates/common/numericliteral.hbs +1 -0
  22. data/lib/templates/common/stringliteral.hbs +1 -0
  23. data/lib/templates/common/variable.hbs +1 -0
  24. data/lib/templates/java/_body.hbs +5 -0
  25. data/lib/templates/java/_item_as_function.hbs +6 -0
  26. data/lib/templates/java/_scenario.hbs +7 -0
  27. data/lib/templates/java/actionword.hbs +1 -0
  28. data/lib/templates/java/actionwords.hbs +8 -0
  29. data/lib/templates/java/argument.hbs +1 -0
  30. data/lib/templates/java/assign.hbs +1 -0
  31. data/lib/templates/java/binaryexpression.hbs +1 -0
  32. data/lib/templates/java/call.hbs +1 -0
  33. data/lib/templates/java/dataset.hbs +3 -0
  34. data/lib/templates/java/dict.hbs +1 -0
  35. data/lib/templates/java/field.hbs +1 -0
  36. data/lib/templates/java/ifthen.hbs +7 -0
  37. data/lib/templates/java/index.hbs +1 -0
  38. data/lib/templates/java/list.hbs +1 -0
  39. data/lib/templates/java/nullliteral.hbs +1 -0
  40. data/lib/templates/java/output_config +11 -0
  41. data/lib/templates/java/parameter.hbs +1 -0
  42. data/lib/templates/java/parenthesis.hbs +1 -0
  43. data/lib/templates/java/property.hbs +1 -0
  44. data/lib/templates/java/scenario.hbs +1 -0
  45. data/lib/templates/java/scenarios.hbs +11 -0
  46. data/lib/templates/java/single_scenario.hbs +11 -0
  47. data/lib/templates/java/single_test.hbs +11 -0
  48. data/lib/templates/java/step.hbs +1 -0
  49. data/lib/templates/java/stringliteral.hbs +1 -0
  50. data/lib/templates/java/tag.hbs +1 -0
  51. data/lib/templates/java/template.hbs +1 -0
  52. data/lib/templates/java/test.hbs +1 -0
  53. data/lib/templates/java/testng/_scenario.hbs +8 -0
  54. data/lib/templates/java/testng/dataset.hbs +4 -0
  55. data/lib/templates/java/testng/scenarios.hbs +16 -0
  56. data/lib/templates/java/testng/single_scenario.hbs +11 -0
  57. data/lib/templates/java/testng/single_test.hbs +11 -0
  58. data/lib/templates/java/testng/tests.hbs +16 -0
  59. data/lib/templates/java/tests.hbs +11 -0
  60. data/lib/templates/java/unaryexpression.hbs +1 -0
  61. data/lib/templates/java/variable.hbs +1 -0
  62. data/lib/templates/java/while.hbs +4 -0
  63. data/lib/templates/python/_body.hbs +10 -0
  64. data/lib/templates/python/_item_as_def.hbs +2 -0
  65. data/lib/templates/python/_parameters.hbs +1 -0
  66. data/lib/templates/python/_scenario.hbs +4 -0
  67. data/lib/templates/python/actionword.hbs +1 -0
  68. data/lib/templates/python/actionwords.hbs +9 -0
  69. data/lib/templates/python/argument.hbs +1 -0
  70. data/lib/templates/python/assign.hbs +1 -0
  71. data/lib/templates/python/binaryexpression.hbs +1 -0
  72. data/lib/templates/python/call.hbs +1 -0
  73. data/lib/templates/python/dataset.hbs +2 -0
  74. data/lib/templates/python/dict.hbs +1 -0
  75. data/lib/templates/python/field.hbs +1 -0
  76. data/lib/templates/python/ifthen.hbs +4 -0
  77. data/lib/templates/python/index.hbs +1 -0
  78. data/lib/templates/python/list.hbs +1 -0
  79. data/lib/templates/python/nullliteral.hbs +1 -0
  80. data/lib/templates/python/output_config +9 -0
  81. data/lib/templates/python/parameter.hbs +1 -0
  82. data/lib/templates/python/parenthesis.hbs +1 -0
  83. data/lib/templates/python/project.hbs +2 -0
  84. data/lib/templates/python/property.hbs +1 -0
  85. data/lib/templates/python/scenario.hbs +1 -0
  86. data/lib/templates/python/scenarios.hbs +11 -0
  87. data/lib/templates/python/single_scenario.hbs +9 -0
  88. data/lib/templates/python/single_test.hbs +9 -0
  89. data/lib/templates/python/step.hbs +1 -0
  90. data/lib/templates/python/tag.hbs +1 -0
  91. data/lib/templates/python/template.hbs +1 -0
  92. data/lib/templates/python/test.hbs +1 -0
  93. data/lib/templates/python/tests.hbs +11 -0
  94. data/lib/templates/python/unaryexpression.hbs +1 -0
  95. data/lib/templates/python/while.hbs +4 -0
  96. data/lib/templates/robotframework/_keyword.hbs +4 -0
  97. data/lib/templates/robotframework/_scenario.hbs +11 -0
  98. data/lib/templates/robotframework/actionword.hbs +1 -0
  99. data/lib/templates/robotframework/actionwords.hbs +4 -0
  100. data/lib/templates/robotframework/argument.hbs +1 -0
  101. data/lib/templates/robotframework/assign.hbs +1 -0
  102. data/lib/templates/robotframework/binaryexpression.hbs +1 -0
  103. data/lib/templates/robotframework/call.hbs +1 -0
  104. data/lib/templates/robotframework/dataset.hbs +1 -0
  105. data/lib/templates/robotframework/datatable.hbs +2 -0
  106. data/lib/templates/robotframework/dict.hbs +1 -0
  107. data/lib/templates/robotframework/field.hbs +1 -0
  108. data/lib/templates/robotframework/ifthen.hbs +1 -0
  109. data/lib/templates/robotframework/index.hbs +1 -0
  110. data/lib/templates/robotframework/list.hbs +1 -0
  111. data/lib/templates/robotframework/nullliteral.hbs +1 -0
  112. data/lib/templates/robotframework/output_config +8 -0
  113. data/lib/templates/robotframework/parameter.hbs +1 -0
  114. data/lib/templates/robotframework/parenthesis.hbs +1 -0
  115. data/lib/templates/robotframework/project.hbs +2 -0
  116. data/lib/templates/robotframework/property.hbs +1 -0
  117. data/lib/templates/robotframework/scenario.hbs +1 -0
  118. data/lib/templates/robotframework/scenarios.hbs +1 -0
  119. data/lib/templates/robotframework/single_scenario.hbs +11 -0
  120. data/lib/templates/robotframework/single_test.hbs +11 -0
  121. data/lib/templates/robotframework/step.hbs +1 -0
  122. data/lib/templates/robotframework/stringliteral.hbs +1 -0
  123. data/lib/templates/robotframework/tag.hbs +1 -0
  124. data/lib/templates/robotframework/template.hbs +1 -0
  125. data/lib/templates/robotframework/test.hbs +1 -0
  126. data/lib/templates/robotframework/tests.hbs +1 -0
  127. data/lib/templates/robotframework/unaryexpression.hbs +1 -0
  128. data/lib/templates/robotframework/variable.hbs +1 -0
  129. data/lib/templates/robotframework/while.hbs +1 -0
  130. data/lib/templates/ruby/_body.hbs +9 -0
  131. data/lib/templates/ruby/_item_as_def.hbs +3 -0
  132. data/lib/templates/ruby/_scenario.hbs +5 -0
  133. data/lib/templates/ruby/actionword.hbs +1 -0
  134. data/lib/templates/ruby/actionwords.hbs +6 -0
  135. data/lib/templates/ruby/argument.hbs +1 -0
  136. data/lib/templates/ruby/assign.hbs +1 -0
  137. data/lib/templates/ruby/binaryexpression.hbs +1 -0
  138. data/lib/templates/ruby/call.hbs +1 -0
  139. data/lib/templates/ruby/dataset.hbs +3 -0
  140. data/lib/templates/ruby/dict.hbs +1 -0
  141. data/lib/templates/ruby/field.hbs +1 -0
  142. data/lib/templates/ruby/ifthen.hbs +7 -0
  143. data/lib/templates/ruby/index.hbs +1 -0
  144. data/lib/templates/ruby/list.hbs +1 -0
  145. data/lib/templates/ruby/minitest/_item_as_def.hbs +3 -0
  146. data/lib/templates/ruby/minitest/_scenario.hbs +4 -0
  147. data/lib/templates/ruby/minitest/dataset.hbs +3 -0
  148. data/lib/templates/ruby/minitest/output_config +6 -0
  149. data/lib/templates/ruby/minitest/scenario.hbs +1 -0
  150. data/lib/templates/ruby/minitest/scenarios.hbs +13 -0
  151. data/lib/templates/ruby/minitest/single_scenario.hbs +11 -0
  152. data/lib/templates/ruby/minitest/single_test.hbs +11 -0
  153. data/lib/templates/ruby/minitest/test.hbs +1 -0
  154. data/lib/templates/ruby/minitest/tests.hbs +13 -0
  155. data/lib/templates/ruby/output_config +6 -0
  156. data/lib/templates/ruby/parameter.hbs +1 -0
  157. data/lib/templates/ruby/parenthesis.hbs +1 -0
  158. data/lib/templates/ruby/project.hbs +2 -0
  159. data/lib/templates/ruby/property.hbs +1 -0
  160. data/lib/templates/ruby/scenario.hbs +1 -0
  161. data/lib/templates/ruby/scenarios.hbs +12 -0
  162. data/lib/templates/ruby/single_scenario.hbs +11 -0
  163. data/lib/templates/ruby/single_test.hbs +11 -0
  164. data/lib/templates/ruby/step.hbs +1 -0
  165. data/lib/templates/ruby/tag.hbs +1 -0
  166. data/lib/templates/ruby/template.hbs +1 -0
  167. data/lib/templates/ruby/test.hbs +1 -0
  168. data/lib/templates/ruby/tests.hbs +12 -0
  169. data/lib/templates/ruby/unaryexpression.hbs +1 -0
  170. data/lib/templates/ruby/while.hbs +5 -0
  171. data/lib/templates/seleniumide/argument.hbs +1 -0
  172. data/lib/templates/seleniumide/call.hbs +6 -0
  173. data/lib/templates/seleniumide/output_config +9 -0
  174. data/lib/templates/seleniumide/single_test.hbs +28 -0
  175. data/lib/templates/seleniumide/step.hbs +0 -0
  176. data/lib/templates/seleniumide/stringliteral.hbs +1 -0
  177. data/lib/templates/seleniumide/template.hbs +1 -0
  178. data/lib/templates/seleniumide/test.hbs +4 -0
  179. data/lib/templates/seleniumide/tests.hbs +19 -0
  180. metadata +404 -0
@@ -0,0 +1,45 @@
1
+ module Hiptest
2
+ module Nodes
3
+ class Walker
4
+ def initialize(order = :parent_first)
5
+ @order = order
6
+ end
7
+
8
+ def walk_node(node)
9
+ self.send(@order, node)
10
+ end
11
+
12
+ private
13
+
14
+ def walk_children(node)
15
+ return unless node.is_a? Hiptest::Nodes::Node
16
+ node.children.values.each {|child| walk_node(child)}
17
+ end
18
+
19
+ def call_node_walker(node)
20
+ return unless node.is_a? Hiptest::Nodes::Node
21
+
22
+ node_class = node.class.name.split('::').last.downcase
23
+ walk_method_name = "walk_#{node_class}".to_sym
24
+
25
+ if self.methods.include? walk_method_name
26
+ self.send(walk_method_name, node)
27
+ end
28
+ end
29
+
30
+ def parent_first(node)
31
+ call_node_walker(node)
32
+ node.each {|item| walk_node(item)} if node.is_a? Array
33
+
34
+ walk_children(node)
35
+ end
36
+
37
+ def children_first(node)
38
+ walk_children(node)
39
+
40
+ node.each {|item| walk_node(item)} if node.is_a? Array
41
+ call_node_walker(node)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,225 @@
1
+ require 'optparse'
2
+ require 'parseconfig'
3
+ require 'ostruct'
4
+
5
+ require 'hiptest-publisher/utils'
6
+
7
+ class FileConfigParser
8
+ def self.update_options(options)
9
+ config = ParseConfig.new(options.config)
10
+ config.get_params.each do |param|
11
+ options.send("#{param}=", config[param])
12
+ end
13
+ options
14
+
15
+ rescue Exception => err
16
+ trace_exception(err) if options.verbose
17
+ options
18
+ end
19
+ end
20
+
21
+ class Option
22
+ attr_reader :short, :long, :default, :type, :help, :attribute
23
+
24
+ def initialize(short, long, default, type, help, attribute)
25
+ @short = short
26
+ @long = long
27
+ @default = default
28
+ @type = type
29
+ @help = help
30
+ @attribute = attribute
31
+ end
32
+
33
+ def help
34
+ return @help if default.nil?
35
+
36
+ if @default.is_a? String
37
+ @default.empty? ? @help : "#{@help} (default: #{@default})"
38
+ else
39
+ "#{@help} (default: #{@default})"
40
+ end
41
+ end
42
+
43
+ def register(opts, options)
44
+ options[attribute] = @default unless default.nil?
45
+ on_values = [
46
+ @short ? "-#{@short}" : nil,
47
+ "--#{@long}",
48
+ @type,
49
+ help
50
+ ].compact
51
+
52
+ opts.on(*on_values) do |value|
53
+ options[attribute] = value
54
+ end
55
+ end
56
+ end
57
+
58
+ class OptionsParser
59
+ def self.languages
60
+ # First framework is default framework
61
+
62
+ {
63
+ 'Ruby' => ['Rspec', 'MiniTest'],
64
+ 'Java' => ['JUnit', 'Test NG'],
65
+ 'Python' => ['Unittest'],
66
+ 'Robot Framework' => [''],
67
+ 'Selenium IDE' => ['']
68
+ }
69
+ end
70
+
71
+ def self.all_options
72
+ [
73
+ Option.new('t', 'token=TOKEN', nil, String, "Secret token (available in your project settings)", :token),
74
+ Option.new('l', 'language=LANG', 'ruby', String, "Target language", :language),
75
+ Option.new('f', 'framework=FRAMEWORK', '', String, "Test framework to use", :framework),
76
+ Option.new('o', 'output-directory=PATH', '.', String, "Output directory", :output_directory),
77
+ Option.new('c', 'config-file=PATH', 'config', String, "Configuration file", :config),
78
+ Option.new(nil, 'scenario-ids=IDS', '', String, "Filter scenarios by ids", :filter_ids),
79
+ Option.new(nil, 'scenario-tags=TAGS', '', String, "Filter scenarios by tags", :filter_tags),
80
+ Option.new(nil, 'tests-only', false, nil, "Export only the tests", :tests_only),
81
+ Option.new(nil, 'actionwords-only', false, nil, "Export only the actionwords", :actionwords_only),
82
+ Option.new(nil, 'split-scenarios', false, nil, "Export each scenario in a single file", :split_scenarios),
83
+ Option.new(nil, 'leafless-export', false, nil, "Use only last level action word", :leafless_export),
84
+ Option.new('s', 'site=SITE', 'https://www.hiptest-testing.com', String, "Site to fetch from", :site),
85
+ Option.new('v', 'verbose', false, nil, "Run verbosely", :verbose)
86
+ ]
87
+ end
88
+
89
+ def self.parse(args)
90
+ options = OpenStruct.new
91
+ opt_parser = OptionParser.new do |opts|
92
+ opts.banner = "Usage: ruby publisher.rb [options]"
93
+ opts.separator ""
94
+ opts.separator "Exports tests from Hiptest for automation."
95
+ opts.separator ""
96
+ opts.separator "Specific options:"
97
+
98
+ all_options.each {|o| o.register(opts, options)}
99
+
100
+ opts.on("-H", "--languages-help", "Show languages and framework options") do
101
+ self.show_languages
102
+ exit
103
+ end
104
+
105
+ opts.on("-F", "--filters-help", "Show help about scenario filtering") do
106
+ [
107
+ "hiptest-publisher allows you to filter the exported scenarios.",
108
+ "You can select the ids of the scenarios:",
109
+ "hiptest-publisher --scenario-ids=12",
110
+ "hiptest-publisher --scenario-ids=12,15,16",
111
+ "",
112
+ "You can also filter by tags:",
113
+ "hiptest-publisher --scenario-tags=mytag",
114
+ "hiptest-publisher --scenario-tags=mytag,myother:tag",
115
+ "",
116
+ "You can not mix ids and tag filtering, only the id filtering will be applied."
117
+ ].each {|line| puts line}
118
+ exit
119
+ end
120
+
121
+ opts.on_tail("-h", "--help", "Show this message") do
122
+ puts opts
123
+ exit
124
+ end
125
+ end
126
+
127
+ opt_parser.parse!(args)
128
+ FileConfigParser.update_options options
129
+
130
+ show_options(options) if options.verbose
131
+ options
132
+ end
133
+
134
+ def self.show_options(options)
135
+ puts "Running Hiptest-publisher with:".yellow
136
+ options.marshal_dump.each { |k, v| puts " - #{k}: #{v}".white }
137
+ end
138
+
139
+ def self.make_language_option(lang, framework = '')
140
+ lang_opt = "--language=#{lang.downcase.gsub(' ', '')}"
141
+ framework_opt = "--framework=#{framework.downcase.gsub(' ', '')}"
142
+
143
+ framework.empty? ? lang_opt : "#{lang_opt} #{framework_opt}"
144
+ end
145
+
146
+ def self.show_languages
147
+ puts "Supported languages:"
148
+ languages.each do |language, frameworks|
149
+ puts "#{language}:"
150
+ if frameworks.empty?
151
+ puts " no framework option available #{make_language_option(language, '')}"
152
+ else
153
+ frameworks.each_with_index do |fw, index|
154
+ if index == 0
155
+ puts " - #{fw} [default] #{make_language_option(language, '')}"
156
+ else
157
+ puts " - #{fw} #{make_language_option(language, fw)}"
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ class LanguageConfigParser
166
+ def initialize(options)
167
+ @options = options
168
+ @config = ParseConfig.new(find_config_file(options))
169
+ end
170
+
171
+ def find_config_file(options)
172
+ ["#{options.language}/#{options.framework}", "#{options.language}"].map do |p|
173
+ path = "#{hiptest_publisher_path}/lib/templates/#{p}/output_config"
174
+ path if File.file?(path)
175
+ end.compact.first
176
+ end
177
+
178
+ def scenario_output_file(scenario_name)
179
+ if make_context('tests').has_key? :class_name_convention
180
+ scenario_name = scenario_name.send(make_context('tests')[:class_name_convention])
181
+ else
182
+ scenario_name = scenario_name.normalize
183
+ end
184
+
185
+ @config['tests']['scenario_filename'].gsub('%s', scenario_name)
186
+ end
187
+
188
+ def scenario_output_dir(scenario_name)
189
+ "#{@options.output_directory}/#{scenario_output_file(scenario_name)}"
190
+ end
191
+
192
+ def tests_output_dir
193
+ "#{@options.output_directory}/#{@config['tests']['filename']}"
194
+ end
195
+
196
+ def aw_output_dir
197
+ "#{@options.output_directory}/#{@config['actionwords']['filename']}"
198
+ end
199
+
200
+ def tests_render_context
201
+ make_context('tests')
202
+ end
203
+
204
+ def actionword_render_context
205
+ make_context('actionwords')
206
+ end
207
+
208
+ private
209
+ def make_context group
210
+ context = {
211
+ :forced_templates => {}
212
+ }
213
+
214
+ if @options.split_scenarios
215
+ context[:forced_templates]['scenario'] = 'single_scenario'
216
+ context[:forced_templates]['test'] = 'single_test'
217
+ end
218
+
219
+ context[:package] = @options.package unless @options.package.nil?
220
+ context[:framework] = @options.framework unless @options.framework.nil?
221
+
222
+ @config[group].each {|param, value| context[param.to_sym] = value }
223
+ context
224
+ end
225
+ end
@@ -0,0 +1,139 @@
1
+ require 'hiptest-publisher/nodes_walker'
2
+
3
+ module Hiptest
4
+ module Nodes
5
+ class ParameterTypeAdder < Hiptest::Nodes::Walker
6
+ attr_reader :call_types
7
+
8
+ def self.add(project)
9
+ walker = Hiptest::Nodes::ParameterTypeAdder.new
10
+ walker.walk_node(project)
11
+
12
+ Hiptest::Nodes::TypeWriter.new(walker.call_types).walk_node(project)
13
+ end
14
+
15
+ def initialize
16
+ super(:parent_first)
17
+ end
18
+
19
+ def walk_project(project)
20
+ @call_types = CallTypes.new
21
+ end
22
+
23
+ def walk_call(call)
24
+ @call_types.add_callable_item(call.children[:actionword])
25
+ end
26
+
27
+ def walk_argument(arg)
28
+ get_literal_values(arg).each {|value|
29
+ @call_types.add_argument(arg.children[:name], value[0], value[1])
30
+ }
31
+ end
32
+
33
+ def walk_actionword(actionword)
34
+ @call_types.add_callable_item(actionword.children[:name])
35
+ end
36
+
37
+ def walk_scenario(scenario)
38
+ @call_types.add_callable_item(scenario.children[:name])
39
+ end
40
+
41
+ private
42
+
43
+ def get_literal_values(node)
44
+ literals = node.find_sub_nodes([StringLiteral, NumericLiteral, BooleanLiteral])
45
+
46
+ return [[NullLiteral, nil]] if literals.empty?
47
+ literals.map {|literal| [literal.class, literal.children[:value]]}
48
+ end
49
+ end
50
+
51
+ class TypeWriter < Hiptest::Nodes::Walker
52
+ def initialize(call_types)
53
+ super(:parent_first)
54
+ @call_types = call_types
55
+ @callable_item_name = nil
56
+ end
57
+
58
+ def walk_actionword actionword
59
+ @callable_item_name = actionword.children[:name]
60
+ end
61
+
62
+ def walk_scenario(scenario)
63
+ @callable_item_name = scenario.children[:name]
64
+ end
65
+
66
+ def walk_parameter parameter
67
+ parameter.children[:type] = @call_types.type_of(@callable_item_name, parameter.children[:name])
68
+ end
69
+ end
70
+
71
+ class CallTypes
72
+ def initialize
73
+ @callable_items = {}
74
+ @current = nil
75
+ end
76
+
77
+ def select_callable_item(name)
78
+ @current = @callable_items[name]
79
+ end
80
+
81
+ def add_callable_item(name)
82
+ @callable_items[name] = {} unless @callable_items.keys.include?(name)
83
+ select_callable_item(name)
84
+ end
85
+
86
+ def add_argument(name, type, value)
87
+ add_parameter(name)
88
+ @current[name][:values] << {type: type, value: value}
89
+ end
90
+
91
+ def add_default_value(name, type, value)
92
+ add_parameter(name)
93
+ @current[name][:default] = {type: type, value: value}
94
+ end
95
+
96
+ def type_of(item_name, parameter_name)
97
+ return unless @callable_items.keys.include?(item_name)
98
+ parameter = @callable_items[item_name][parameter_name]
99
+
100
+ return :String if parameter.nil? || parameter[:values].empty?
101
+ return type_from_values(parameter[:values])
102
+ end
103
+
104
+ private
105
+
106
+ def add_parameter(name)
107
+ return if @current.keys.include?(name)
108
+ @current[name] = {default: nil, values: []}
109
+ end
110
+
111
+ def type_from_values(values)
112
+ types = values.map {|val| val[:type] unless val[:type] == Hiptest::Nodes::NullLiteral}.compact.uniq
113
+
114
+ if types.empty?
115
+ :null
116
+ elsif types.length == 1
117
+ if types.first == Hiptest::Nodes::StringLiteral
118
+ :String
119
+ elsif types.first == Hiptest::Nodes::BooleanLiteral
120
+ :bool
121
+ elsif types.first == Hiptest::Nodes::NumericLiteral
122
+ determine_numeric(values)
123
+ end
124
+ else
125
+ :String
126
+ end
127
+ end
128
+
129
+ def determine_numeric(values)
130
+ types = values.map do |val|
131
+ next unless val[:type] == Hiptest::Nodes::NumericLiteral
132
+ return :float if val[:value].include?(".")
133
+ end.compact.uniq
134
+
135
+ :int
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,18 @@
1
+ module Hiptest
2
+ module Nodes
3
+ class ParentAdder < Walker
4
+ def self.add(project)
5
+ Hiptest::Nodes::ParentAdder.new().walk_node(project)
6
+ end
7
+
8
+ def walk_node(node)
9
+ super(node)
10
+ return unless node.is_a? Hiptest::Nodes::Node
11
+
12
+ node.direct_children.each {|child|
13
+ child.parent = node
14
+ }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,92 @@
1
+ module Hiptest
2
+ module RenderContextMaker
3
+ def walk_item(item)
4
+ {
5
+ :has_parameters? => !item.children[:parameters].empty?,
6
+ :has_tags? => !item.children[:tags].empty?,
7
+ :has_step? => !item.find_sub_nodes(Hiptest::Nodes::Step).empty?,
8
+ :is_empty? => item.children[:body].empty?
9
+ }
10
+ end
11
+
12
+ alias :walk_actionword :walk_item
13
+
14
+ def walk_scenario(scenario)
15
+ base = walk_item(scenario)
16
+ base[:project_name] = scenario.parent.parent.children[:name]
17
+
18
+ datatable = scenario.children[:datatable]
19
+ base[:has_datasets?] = datatable ? !datatable.children[:datasets].empty? : false
20
+ return base
21
+ end
22
+
23
+ def walk_dataset(dataset)
24
+ datatable = dataset.parent
25
+ {
26
+ :scenario_name => datatable.parent.children[:name]
27
+ }
28
+ end
29
+
30
+ def walk_scenarios(scenarios)
31
+ {
32
+ :project_name => scenarios.parent.children[:name]
33
+ }
34
+ end
35
+
36
+ def walk_test(test)
37
+ {
38
+ :has_parameters? => false,
39
+ :has_tags? => !test.children[:tags].empty?,
40
+ :has_step? => !test.find_sub_nodes(Hiptest::Nodes::Step).empty?,
41
+ :is_empty? => test.children[:body].empty?,
42
+ :has_datasets? => false,
43
+ :project_name => test.parent.parent.children[:name],
44
+ }
45
+ end
46
+
47
+ def walk_tests(tests)
48
+ {
49
+ :project_name => tests.parent.children[:name]
50
+ }
51
+ end
52
+
53
+ def walk_call(c)
54
+ {
55
+ :has_arguments? => !c.children[:arguments].empty?
56
+ }
57
+ end
58
+
59
+ def walk_ifthen(it)
60
+ {
61
+ :has_else? => !it.children[:else].empty?
62
+ }
63
+ end
64
+
65
+ def walk_parameter(p)
66
+ {
67
+ :has_default_value? => !p.children[:default].nil?
68
+ }
69
+ end
70
+
71
+ def walk_tag(t)
72
+ {
73
+ :has_value? => !t.children[:value].nil?
74
+ }
75
+ end
76
+
77
+ def walk_template(t)
78
+ treated = t.children[:chunks].map do |chunk|
79
+ {
80
+ :is_variable? => chunk.is_a?(Hiptest::Nodes::Variable),
81
+ :raw => chunk
82
+ }
83
+ end
84
+ variable_names = treated.map {|item| item[:raw].children[:name] if item[:is_variable?]}.compact
85
+
86
+ {
87
+ :treated_chunks => treated,
88
+ :variable_names => variable_names
89
+ }
90
+ end
91
+ end
92
+ end