hiptest-publisher 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +98 -0
- data/bin/hiptest-publisher +11 -0
- data/lib/hiptest-publisher.rb +121 -0
- data/lib/hiptest-publisher/call_arguments_adder.rb +63 -0
- data/lib/hiptest-publisher/handlebars_helper.rb +97 -0
- data/lib/hiptest-publisher/nodes.rb +380 -0
- data/lib/hiptest-publisher/nodes_walker.rb +45 -0
- data/lib/hiptest-publisher/options_parser.rb +225 -0
- data/lib/hiptest-publisher/parameter_type_adder.rb +139 -0
- data/lib/hiptest-publisher/parent_adder.rb +18 -0
- data/lib/hiptest-publisher/render_context_maker.rb +92 -0
- data/lib/hiptest-publisher/renderer.rb +87 -0
- data/lib/hiptest-publisher/string.rb +52 -0
- data/lib/hiptest-publisher/utils.rb +47 -0
- data/lib/hiptest-publisher/xml_parser.rb +294 -0
- data/lib/templates/common/booleanliteral.hbs +1 -0
- data/lib/templates/common/dataset.hbs +0 -0
- data/lib/templates/common/datatable.hbs +3 -0
- data/lib/templates/common/nullliteral.hbs +1 -0
- data/lib/templates/common/numericliteral.hbs +1 -0
- data/lib/templates/common/stringliteral.hbs +1 -0
- data/lib/templates/common/variable.hbs +1 -0
- data/lib/templates/java/_body.hbs +5 -0
- data/lib/templates/java/_item_as_function.hbs +6 -0
- data/lib/templates/java/_scenario.hbs +7 -0
- data/lib/templates/java/actionword.hbs +1 -0
- data/lib/templates/java/actionwords.hbs +8 -0
- data/lib/templates/java/argument.hbs +1 -0
- data/lib/templates/java/assign.hbs +1 -0
- data/lib/templates/java/binaryexpression.hbs +1 -0
- data/lib/templates/java/call.hbs +1 -0
- data/lib/templates/java/dataset.hbs +3 -0
- data/lib/templates/java/dict.hbs +1 -0
- data/lib/templates/java/field.hbs +1 -0
- data/lib/templates/java/ifthen.hbs +7 -0
- data/lib/templates/java/index.hbs +1 -0
- data/lib/templates/java/list.hbs +1 -0
- data/lib/templates/java/nullliteral.hbs +1 -0
- data/lib/templates/java/output_config +11 -0
- data/lib/templates/java/parameter.hbs +1 -0
- data/lib/templates/java/parenthesis.hbs +1 -0
- data/lib/templates/java/property.hbs +1 -0
- data/lib/templates/java/scenario.hbs +1 -0
- data/lib/templates/java/scenarios.hbs +11 -0
- data/lib/templates/java/single_scenario.hbs +11 -0
- data/lib/templates/java/single_test.hbs +11 -0
- data/lib/templates/java/step.hbs +1 -0
- data/lib/templates/java/stringliteral.hbs +1 -0
- data/lib/templates/java/tag.hbs +1 -0
- data/lib/templates/java/template.hbs +1 -0
- data/lib/templates/java/test.hbs +1 -0
- data/lib/templates/java/testng/_scenario.hbs +8 -0
- data/lib/templates/java/testng/dataset.hbs +4 -0
- data/lib/templates/java/testng/scenarios.hbs +16 -0
- data/lib/templates/java/testng/single_scenario.hbs +11 -0
- data/lib/templates/java/testng/single_test.hbs +11 -0
- data/lib/templates/java/testng/tests.hbs +16 -0
- data/lib/templates/java/tests.hbs +11 -0
- data/lib/templates/java/unaryexpression.hbs +1 -0
- data/lib/templates/java/variable.hbs +1 -0
- data/lib/templates/java/while.hbs +4 -0
- data/lib/templates/python/_body.hbs +10 -0
- data/lib/templates/python/_item_as_def.hbs +2 -0
- data/lib/templates/python/_parameters.hbs +1 -0
- data/lib/templates/python/_scenario.hbs +4 -0
- data/lib/templates/python/actionword.hbs +1 -0
- data/lib/templates/python/actionwords.hbs +9 -0
- data/lib/templates/python/argument.hbs +1 -0
- data/lib/templates/python/assign.hbs +1 -0
- data/lib/templates/python/binaryexpression.hbs +1 -0
- data/lib/templates/python/call.hbs +1 -0
- data/lib/templates/python/dataset.hbs +2 -0
- data/lib/templates/python/dict.hbs +1 -0
- data/lib/templates/python/field.hbs +1 -0
- data/lib/templates/python/ifthen.hbs +4 -0
- data/lib/templates/python/index.hbs +1 -0
- data/lib/templates/python/list.hbs +1 -0
- data/lib/templates/python/nullliteral.hbs +1 -0
- data/lib/templates/python/output_config +9 -0
- data/lib/templates/python/parameter.hbs +1 -0
- data/lib/templates/python/parenthesis.hbs +1 -0
- data/lib/templates/python/project.hbs +2 -0
- data/lib/templates/python/property.hbs +1 -0
- data/lib/templates/python/scenario.hbs +1 -0
- data/lib/templates/python/scenarios.hbs +11 -0
- data/lib/templates/python/single_scenario.hbs +9 -0
- data/lib/templates/python/single_test.hbs +9 -0
- data/lib/templates/python/step.hbs +1 -0
- data/lib/templates/python/tag.hbs +1 -0
- data/lib/templates/python/template.hbs +1 -0
- data/lib/templates/python/test.hbs +1 -0
- data/lib/templates/python/tests.hbs +11 -0
- data/lib/templates/python/unaryexpression.hbs +1 -0
- data/lib/templates/python/while.hbs +4 -0
- data/lib/templates/robotframework/_keyword.hbs +4 -0
- data/lib/templates/robotframework/_scenario.hbs +11 -0
- data/lib/templates/robotframework/actionword.hbs +1 -0
- data/lib/templates/robotframework/actionwords.hbs +4 -0
- data/lib/templates/robotframework/argument.hbs +1 -0
- data/lib/templates/robotframework/assign.hbs +1 -0
- data/lib/templates/robotframework/binaryexpression.hbs +1 -0
- data/lib/templates/robotframework/call.hbs +1 -0
- data/lib/templates/robotframework/dataset.hbs +1 -0
- data/lib/templates/robotframework/datatable.hbs +2 -0
- data/lib/templates/robotframework/dict.hbs +1 -0
- data/lib/templates/robotframework/field.hbs +1 -0
- data/lib/templates/robotframework/ifthen.hbs +1 -0
- data/lib/templates/robotframework/index.hbs +1 -0
- data/lib/templates/robotframework/list.hbs +1 -0
- data/lib/templates/robotframework/nullliteral.hbs +1 -0
- data/lib/templates/robotframework/output_config +8 -0
- data/lib/templates/robotframework/parameter.hbs +1 -0
- data/lib/templates/robotframework/parenthesis.hbs +1 -0
- data/lib/templates/robotframework/project.hbs +2 -0
- data/lib/templates/robotframework/property.hbs +1 -0
- data/lib/templates/robotframework/scenario.hbs +1 -0
- data/lib/templates/robotframework/scenarios.hbs +1 -0
- data/lib/templates/robotframework/single_scenario.hbs +11 -0
- data/lib/templates/robotframework/single_test.hbs +11 -0
- data/lib/templates/robotframework/step.hbs +1 -0
- data/lib/templates/robotframework/stringliteral.hbs +1 -0
- data/lib/templates/robotframework/tag.hbs +1 -0
- data/lib/templates/robotframework/template.hbs +1 -0
- data/lib/templates/robotframework/test.hbs +1 -0
- data/lib/templates/robotframework/tests.hbs +1 -0
- data/lib/templates/robotframework/unaryexpression.hbs +1 -0
- data/lib/templates/robotframework/variable.hbs +1 -0
- data/lib/templates/robotframework/while.hbs +1 -0
- data/lib/templates/ruby/_body.hbs +9 -0
- data/lib/templates/ruby/_item_as_def.hbs +3 -0
- data/lib/templates/ruby/_scenario.hbs +5 -0
- data/lib/templates/ruby/actionword.hbs +1 -0
- data/lib/templates/ruby/actionwords.hbs +6 -0
- data/lib/templates/ruby/argument.hbs +1 -0
- data/lib/templates/ruby/assign.hbs +1 -0
- data/lib/templates/ruby/binaryexpression.hbs +1 -0
- data/lib/templates/ruby/call.hbs +1 -0
- data/lib/templates/ruby/dataset.hbs +3 -0
- data/lib/templates/ruby/dict.hbs +1 -0
- data/lib/templates/ruby/field.hbs +1 -0
- data/lib/templates/ruby/ifthen.hbs +7 -0
- data/lib/templates/ruby/index.hbs +1 -0
- data/lib/templates/ruby/list.hbs +1 -0
- data/lib/templates/ruby/minitest/_item_as_def.hbs +3 -0
- data/lib/templates/ruby/minitest/_scenario.hbs +4 -0
- data/lib/templates/ruby/minitest/dataset.hbs +3 -0
- data/lib/templates/ruby/minitest/output_config +6 -0
- data/lib/templates/ruby/minitest/scenario.hbs +1 -0
- data/lib/templates/ruby/minitest/scenarios.hbs +13 -0
- data/lib/templates/ruby/minitest/single_scenario.hbs +11 -0
- data/lib/templates/ruby/minitest/single_test.hbs +11 -0
- data/lib/templates/ruby/minitest/test.hbs +1 -0
- data/lib/templates/ruby/minitest/tests.hbs +13 -0
- data/lib/templates/ruby/output_config +6 -0
- data/lib/templates/ruby/parameter.hbs +1 -0
- data/lib/templates/ruby/parenthesis.hbs +1 -0
- data/lib/templates/ruby/project.hbs +2 -0
- data/lib/templates/ruby/property.hbs +1 -0
- data/lib/templates/ruby/scenario.hbs +1 -0
- data/lib/templates/ruby/scenarios.hbs +12 -0
- data/lib/templates/ruby/single_scenario.hbs +11 -0
- data/lib/templates/ruby/single_test.hbs +11 -0
- data/lib/templates/ruby/step.hbs +1 -0
- data/lib/templates/ruby/tag.hbs +1 -0
- data/lib/templates/ruby/template.hbs +1 -0
- data/lib/templates/ruby/test.hbs +1 -0
- data/lib/templates/ruby/tests.hbs +12 -0
- data/lib/templates/ruby/unaryexpression.hbs +1 -0
- data/lib/templates/ruby/while.hbs +5 -0
- data/lib/templates/seleniumide/argument.hbs +1 -0
- data/lib/templates/seleniumide/call.hbs +6 -0
- data/lib/templates/seleniumide/output_config +9 -0
- data/lib/templates/seleniumide/single_test.hbs +28 -0
- data/lib/templates/seleniumide/step.hbs +0 -0
- data/lib/templates/seleniumide/stringliteral.hbs +1 -0
- data/lib/templates/seleniumide/template.hbs +1 -0
- data/lib/templates/seleniumide/test.hbs +4 -0
- data/lib/templates/seleniumide/tests.hbs +19 -0
- 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
|