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,87 @@
1
+ require 'handlebars'
2
+ require 'hiptest-publisher/nodes_walker'
3
+ require 'hiptest-publisher/handlebars_helper'
4
+ require 'hiptest-publisher/render_context_maker'
5
+
6
+ module Hiptest
7
+ class Renderer < Hiptest::Nodes::Walker
8
+ attr_reader :rendered
9
+ include RenderContextMaker
10
+
11
+ def self.render(node, language, context)
12
+ context[:language] = language
13
+
14
+ renderer = Hiptest::Renderer.new(context)
15
+ renderer.walk_node(node)
16
+ renderer.rendered[node]
17
+ end
18
+
19
+ def initialize(context)
20
+ super(:children_first)
21
+ @rendered = {}
22
+ @context = context
23
+ @handlebars = Handlebars::Context.new
24
+ register_partials()
25
+
26
+ Hiptest::HandlebarsHelper.register_helpers(@handlebars, @context)
27
+ end
28
+
29
+ def call_node_walker(node)
30
+ if node.is_a? Hiptest::Nodes::Node
31
+ @rendered_children = {}
32
+ node.children.each {|name, child| @rendered_children[name] = @rendered[child]}
33
+ @rendered[node] = render_node(node, super(node))
34
+ elsif node.is_a? Array
35
+ @rendered[node] = node.map {|item| @rendered[item]}
36
+ else
37
+ @rendered[node] = node
38
+ end
39
+ end
40
+
41
+ def searched_folders()
42
+ folders = []
43
+ if @context.has_key?(:framework)
44
+ folders << "#{@context[:language]}/#{@context[:framework]}"
45
+ end
46
+ folders << [@context[:language], 'common']
47
+ folders.flatten.map {|path| "#{hiptest_publisher_path}/lib/templates/#{path}"}
48
+ end
49
+
50
+ def register_partials()
51
+ searched_folders.reverse.each do |path|
52
+ next unless File.directory?(path)
53
+ Dir.entries(path).select do |file_name|
54
+ file_path = File.join(path, file_name)
55
+ next unless File.file?(file_path) && file_name.start_with?('_')
56
+ @handlebars.register_partial(file_name[1..-5], File.read(file_path))
57
+ end
58
+ end
59
+ end
60
+
61
+ def render_node(node, render_context)
62
+ render_context = {} if render_context.nil?
63
+ render_context[:node] = node
64
+ render_context[:rendered_children] = @rendered_children
65
+ render_context[:context] = @context
66
+
67
+ template = get_template_path(node)
68
+ @handlebars.compile(File.read(template)).send(:call, render_context)
69
+ end
70
+
71
+ def get_template_by_name(name, extension)
72
+ searched_folders.map do |path|
73
+ template_path = File.join(path, "#{name}.#{extension}")
74
+ template_path if File.file?(template_path)
75
+ end.compact.first
76
+ end
77
+
78
+ def get_template_path(node, extension = 'hbs')
79
+ normalized_name = node.class.name.split('::').last.downcase
80
+ unless @context[:forced_templates][normalized_name].nil?
81
+ normalized_name = @context[:forced_templates][normalized_name]
82
+ end
83
+
84
+ get_template_by_name(normalized_name, extension)
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,52 @@
1
+ require 'i18n'
2
+
3
+ require_relative 'utils'
4
+
5
+ class String
6
+ def literate
7
+ I18n.enforce_available_locales = false
8
+ I18n.transliterate(self)
9
+ end
10
+
11
+ def normalize
12
+ literated = self.literate
13
+ literated.strip.gsub(/\s+/, '_').gsub(/\W/, '')
14
+ end
15
+
16
+ def normalize_lower
17
+ literated = self.literate
18
+ literated.strip.gsub(/\s+/, '_').gsub(/\W/, '').downcase
19
+ end
20
+
21
+ def underscore
22
+ # based on:
23
+ # http://stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby
24
+ normalized = self.normalize
25
+ normalized.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
26
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
27
+ tr("-", "_").
28
+ downcase
29
+ end
30
+
31
+ def camelize
32
+ normalized = self.normalize
33
+ normalized.split('_').map {|w| w.empty? ? "" : "#{w[0].upcase}#{w[1..-1]}"}.join
34
+ end
35
+
36
+ def camelize_lower
37
+ normalized = self.normalize
38
+ normalized.split('_').enum_for(:each_with_index).map do |w, i|
39
+ if w.empty?
40
+ ""
41
+ elsif i == 0
42
+ "#{w[0].downcase}#{w[1..-1]}"
43
+ else
44
+ "#{w[0].upcase}#{w[1..-1]}"
45
+ end
46
+ end.join
47
+ end
48
+
49
+ def clear_extension
50
+ self.split('.')[0]
51
+ end
52
+ end
@@ -0,0 +1,47 @@
1
+ require 'open-uri'
2
+ require 'openssl'
3
+ require 'colorize'
4
+
5
+ def hiptest_publisher_path
6
+ Gem.loaded_specs['hiptest-publisher'].full_gem_path
7
+ rescue
8
+ '.'
9
+ end
10
+
11
+ def make_filter(options)
12
+ ids = options.filter_ids.split(',').map {|id| "filter[]=id:#{id}"}
13
+ tags = options.filter_tags.split(',').map {|tag| "filter[]=tag:#{tag}"}
14
+
15
+ filter = (ids + tags).join("&")
16
+ filter.empty? ? '' : "&#{filter}"
17
+ end
18
+
19
+ def fetch_project_export(options)
20
+ url = "#{options.site}/publication/#{options.token}/#{options.leafless_export ? 'leafless_tests' : 'project'}?future=1#{make_filter(options)}"
21
+
22
+ puts "URL: #{url}".white if options.verbose
23
+ open(url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)
24
+ end
25
+
26
+ def trace_exception(exception)
27
+ line = "-" * 80
28
+ puts line.yellow
29
+ puts "#{exception.class.name}: #{exception.message}".red
30
+ puts "#{exception.backtrace.map {|l| " #{l}\n"}.join}".yellow
31
+ puts line.yellow
32
+ end
33
+
34
+ def show_status_message(message, status=nil)
35
+ status_icon = " "
36
+ line_end = status.nil? ? "" : "\n"
37
+ output = STDOUT
38
+
39
+ if status == :success
40
+ status_icon = "v".green
41
+ elsif status == :failure
42
+ status_icon = "x".red
43
+ output = STDERR
44
+ end
45
+
46
+ output.print "[#{status_icon}] #{message}\r#{line_end}"
47
+ end
@@ -0,0 +1,294 @@
1
+ require 'nokogiri'
2
+ require 'colorize'
3
+
4
+ require_relative 'nodes'
5
+ require_relative 'utils'
6
+
7
+ module Hiptest
8
+ class XMLParser
9
+ attr_reader :project
10
+
11
+ def initialize(source, options = nil)
12
+ @source = source
13
+ @xml = Nokogiri::XML(source)
14
+ @options = options
15
+ end
16
+
17
+ def build_nullliteral(value = nil)
18
+ Hiptest::Nodes::NullLiteral.new
19
+ end
20
+
21
+ def build_stringliteral(value)
22
+ if value.is_a? String
23
+ Hiptest::Nodes::StringLiteral.new(value)
24
+ else
25
+ Hiptest::Nodes::StringLiteral.new(value.content)
26
+ end
27
+ end
28
+
29
+ def build_numericliteral(value)
30
+ if value.is_a? Numeric
31
+ Hiptest::Nodes::NumericLiteral.new(value)
32
+ else
33
+ Hiptest::Nodes::NumericLiteral.new(value.content)
34
+ end
35
+ end
36
+
37
+ def build_booleanliteral(value)
38
+ if value.is_a?(TrueClass) || value.is_a?(FalseClass)
39
+ Hiptest::Nodes::BooleanLiteral.new(value)
40
+ else
41
+ Hiptest::Nodes::BooleanLiteral.new(value.content)
42
+ end
43
+ end
44
+
45
+ def build_var(variable)
46
+ Hiptest::Nodes::Variable.new(variable.content)
47
+ end
48
+
49
+ def build_field(field)
50
+ Hiptest::Nodes::Field.new(
51
+ build_node(css_first(field, '> base > *')),
52
+ css_first_content(field, '> name'))
53
+ end
54
+
55
+ def build_index(index)
56
+ Hiptest::Nodes::Index.new(
57
+ build_node(css_first(index, '> base > *')),
58
+ build_node(css_first(index, '> expression > *')))
59
+ end
60
+
61
+ def build_binary_expression(operation)
62
+ Hiptest::Nodes::BinaryExpression.new(
63
+ build_node(css_first(operation, '> left > *')),
64
+ css_first_content(operation, '> operator'),
65
+ build_node(css_first(operation, '> right > *')))
66
+ end
67
+
68
+ def build_unary_expression(operation)
69
+ Hiptest::Nodes::UnaryExpression.new(
70
+ css_first_content(operation, '> operator'),
71
+ build_node(css_first(operation, '> expression > *')))
72
+ end
73
+
74
+ def build_operation(operation)
75
+ if css_first(operation, '> left').nil?
76
+ build_unary_expression(operation)
77
+ else
78
+ build_binary_expression(operation)
79
+ end
80
+ end
81
+
82
+ def build_parenthesis(parenthesis)
83
+ Hiptest::Nodes::Parenthesis.new(
84
+ build_node(css_first(parenthesis)))
85
+ end
86
+
87
+ def build_list(list)
88
+ Hiptest::Nodes::List.new(build_node_list(list.css('> item > *')))
89
+ end
90
+
91
+ def build_dict(dict)
92
+ items = dict.element_children.map do |item|
93
+ Hiptest::Nodes::Property.new(
94
+ item.name,
95
+ build_node(css_first(item)))
96
+ end
97
+ Hiptest::Nodes::Dict.new(items)
98
+ end
99
+
100
+ def build_template(template)
101
+ Hiptest::Nodes::Template.new(build_node_list(template.css('> *')))
102
+ end
103
+
104
+ def build_assign(assign)
105
+ Hiptest::Nodes::Assign.new(
106
+ build_node(css_first(assign, 'to > *')),
107
+ build_node(css_first(assign, 'value > *')))
108
+ end
109
+
110
+ def build_call(call)
111
+ Hiptest::Nodes::Call.new(
112
+ css_first_content(call, '> actionword'),
113
+ build_arguments(call))
114
+ end
115
+
116
+ def build_arguments(arguments)
117
+ build_node_list(arguments.css('> arguments > argument'))
118
+ end
119
+
120
+ def build_argument(argument)
121
+ value = css_first(argument, '> value')
122
+ Hiptest::Nodes::Argument.new(
123
+ css_first_content(argument, 'name'),
124
+ value ? build_node(value) : nil)
125
+ end
126
+
127
+ def build_if(if_then)
128
+ Hiptest::Nodes::IfThen.new(
129
+ build_node(css_first(if_then, '> condition > *')),
130
+ build_node_list(if_then.css('> then > *')),
131
+ build_node_list(if_then.css('> else > *')))
132
+ end
133
+
134
+ def build_step(step)
135
+ first_prop = css_first(step)
136
+ Hiptest::Nodes::Step.new(
137
+ first_prop.name,
138
+ build_node(css_first(first_prop)))
139
+ end
140
+
141
+ def build_while(while_loop)
142
+ Hiptest::Nodes::While.new(
143
+ build_node(css_first(while_loop, '> condition > *')),
144
+ build_node_list(while_loop.css('> body > *')))
145
+ end
146
+
147
+ def build_tag(tag)
148
+ Hiptest::Nodes::Tag.new(
149
+ css_first_content(tag, '> key'),
150
+ css_first_content(tag, '> value'))
151
+ end
152
+
153
+ def build_parameter(parameter)
154
+ default_value = css_first(parameter, '> default_value')
155
+
156
+ Hiptest::Nodes::Parameter.new(
157
+ css_first_content(parameter, 'name'),
158
+ default_value ? build_node(default_value) : nil)
159
+ end
160
+
161
+ def build_default_value(node)
162
+ build_node(css_first(node))
163
+ end
164
+
165
+ def build_value(node)
166
+ build_node(css_first(node))
167
+ end
168
+
169
+ def build_tags(item)
170
+ build_node_list(item.css('> tags tag'))
171
+ end
172
+
173
+ def build_parameters(item)
174
+ build_node_list(item.css('> parameters > parameter'))
175
+ end
176
+
177
+ def build_steps(item)
178
+ build_node_list(item.css('> steps > *'))
179
+ end
180
+
181
+ def build_actionword(actionword)
182
+ Hiptest::Nodes::Actionword.new(
183
+ css_first_content(actionword, 'name'),
184
+ build_tags(actionword),
185
+ build_parameters(actionword),
186
+ build_steps(actionword))
187
+ end
188
+
189
+ def build_scenario(scenario)
190
+ Hiptest::Nodes::Scenario.new(
191
+ css_first_content(scenario, 'name'),
192
+ css_first_content(scenario, 'description'),
193
+ build_tags(scenario),
194
+ build_parameters(scenario),
195
+ build_steps(scenario),
196
+ css_first_content(scenario, 'folderUid'),
197
+ build_node(css_first(scenario, 'datatable'), Hiptest::Nodes::Datatable))
198
+ end
199
+
200
+ def build_datatable(datatable)
201
+ Hiptest::Nodes::Datatable.new(build_node_list(datatable.css('> dataset')))
202
+ end
203
+
204
+ def build_dataset(dataset)
205
+ Hiptest::Nodes::Dataset.new(
206
+ css_first_content(dataset, '> name'),
207
+ build_node_list(dataset.css('> arguments argument')))
208
+ end
209
+
210
+ def build_actionwords(actionwords)
211
+ build_node_list(actionwords.css('> actionword'), Hiptest::Nodes::Actionwords)
212
+ end
213
+
214
+ def build_scenarios(scenarios)
215
+ build_node_list(scenarios.css('> scenario'), Hiptest::Nodes::Scenarios)
216
+ end
217
+
218
+ def build_tests(tests)
219
+ build_node_list(tests.css('> test'), Hiptest::Nodes::Tests)
220
+ end
221
+
222
+ def build_test(test)
223
+ Hiptest::Nodes::Test.new(
224
+ css_first_content(test, 'name'),
225
+ css_first_content(test, 'description'),
226
+ build_tags(test),
227
+ build_steps(test)
228
+ )
229
+ end
230
+
231
+ def build_folder(folder)
232
+ Hiptest::Nodes::Folder.new(
233
+ css_first_content(folder, 'uid'),
234
+ css_first_content(folder, 'parentUid'),
235
+ css_first_content(folder, 'name'))
236
+ end
237
+
238
+ def build_testPlan(test_plan)
239
+ tp = Hiptest::Nodes::TestPlan.new(
240
+ build_node_list(test_plan.css('> folder')))
241
+
242
+ tp.organize_folders
243
+ return tp
244
+ end
245
+
246
+ def build_project
247
+ project = css_first(@xml, 'project')
248
+
249
+ @project = Hiptest::Nodes::Project.new(
250
+ css_first_content(project, '> name'),
251
+ css_first_content(project, '> description'),
252
+ build_node(css_first(project, '> testPlan'), Hiptest::Nodes::TestPlan),
253
+ build_node(css_first(project, '> scenarios'), Hiptest::Nodes::Scenarios),
254
+ build_node(css_first(project, '> actionwords'), Hiptest::Nodes::Actionwords),
255
+ build_node(css_first(project, '> tests'), Hiptest::Nodes::Tests))
256
+
257
+ @project.assign_scenarios_to_folders
258
+ return @project
259
+ end
260
+
261
+ private
262
+
263
+ def build_node(node, default_node=nil)
264
+ if node.nil? && default_node
265
+ return default_node.new
266
+ end
267
+ self.send("build_#{node.name}", node)
268
+ rescue Exception => exception
269
+ if @options && @options.verbose
270
+ puts "Unable to build: \n#{node}".blue
271
+ trace_exception(exception)
272
+ end
273
+ end
274
+
275
+ def build_node_list(l, container_class=nil)
276
+ items = l.map {|item| build_node(item)}
277
+
278
+ unless container_class.nil?
279
+ container_class.new(items)
280
+ else
281
+ items
282
+ end
283
+ end
284
+
285
+ def css_first(node, selector = '> *')
286
+ node.css(selector).first
287
+ end
288
+
289
+ def css_first_content(node, selector = '> *')
290
+ sub_node = css_first(node, selector)
291
+ sub_node.nil? ? nil : sub_node.content
292
+ end
293
+ end
294
+ end