Module: JunitParser

Defined in:
lib/assets/junit_parser.rb

Class Method Summary collapse

Class Method Details

.add_code(codefragment) ⇒ Object



74
75
76
# File 'lib/assets/junit_parser.rb', line 74

def self.add_code(codefragment)
  "<![CDATA[#{codefragment}]]>"
end

.add_failed_testcase(name, failures) ⇒ Object



34
35
36
37
# File 'lib/assets/junit_parser.rb', line 34

def self.add_failed_testcase(name, failures)
  "#{xml_level(2)}<testcase name='#{name}'>" \
  "#{failures}#{xml_level(2)}</testcase>"
end

.add_failure(message, type, text) ⇒ Object



43
44
45
46
47
48
# File 'lib/assets/junit_parser.rb', line 43

def self.add_failure(message, type, text)
  "#{xml_level(3)}<failure #{insert_attribute('type', type)} status='failed' " \
  "#{insert_attribute('message', message)}>" \
	"#{text}" \
	"#{xml_level(3)}</failure>"
end

.add_properties(property_array, value_array) ⇒ Object



50
51
52
53
54
55
56
57
58
59
# File 'lib/assets/junit_parser.rb', line 50

def self.add_properties(property_array, value_array)
  properties = "#{xml_level(2)}<properties>"
  property_array.each_with_index do |property, index|
    value = value_array[index]
    unless value.nil?
      properties += "#{xml_level(3)}<property name='#{property}' value='#{value}' />"
    end
  end
  properties += "#{xml_level(2)}</properties>"
end

.add_success_testcase(name) ⇒ Object



39
40
41
# File 'lib/assets/junit_parser.rb', line 39

def self.add_success_testcase(name)
  "#{xml_level(2)}<testcase name='#{name}' status='success'/>"
end

.add_testsuite(name, testcases) ⇒ Object



28
29
30
31
32
# File 'lib/assets/junit_parser.rb', line 28

def self.add_testsuite(name, testcases)
  "#{xml_level(1)}<testsuite name='#{name}'>" \
  "#{testcases}" \
  "#{xml_level(1)}</testsuite>"
end

.check_for_file_info(text_list) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/assets/junit_parser.rb', line 140

def self.check_for_file_info(text_list)
  result =[]
  text_list.each_with_index do |text, i|
    file = /([a-zA-Z0-9\.]*)?(\/[a-zA-Z0-9\._-]+)*(\.){1}[a-zA-Z0-9\._-]+/.match(text)
    file = nil if file.to_s =~ /\.{2,}/
    unless file==nil 
      next_value=text_list.to_a[i.to_i+1].nil? ? '' : text_list.to_a[i.to_i+1]
   	line = /[0-9]+/.match(next_value)
   	if line ==nil
   	  result=[file]
   	else
   	  result=[file, line]
   	end
   	break
    end 
  end
  result
end

.construct_failure_mes(attributes, values) ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/assets/junit_parser.rb', line 61

def self.construct_failure_mes(attributes, values)
  properties = ''
  attributes.each_with_index do |property, index|
    value = values[index]
    properties += format("#{xml_level(4)}%-18s: %s", property, value) unless value.nil?
  end
  properties
end

.create_junit_xml(testsuite, result_file_name) ⇒ Object

create root xml content



95
96
97
98
# File 'lib/assets/junit_parser.rb', line 95

def self.create_junit_xml(testsuite, result_file_name)
  full_data = create_testsuites(testsuite)
  create_xml(full_data, result_file_name)
end

.create_testsuites(testsuites) ⇒ Object



24
25
26
# File 'lib/assets/junit_parser.rb', line 24

def self.create_testsuites(testsuites)
  "#{xml_level(0)}<testsuites>#{testsuites}#{xml_level(0)}</testsuites>"
end

.create_xml(xml_data_custom, result_file_name) ⇒ Object

For all parsers =================


16
17
18
19
20
21
22
# File 'lib/assets/junit_parser.rb', line 16

def self.create_xml(xml_data_custom, result_file_name)
  xml_data = '<?xml version="1.0" encoding="UTF-8"?>'
  xml_data += xml_data_custom
  File.open(result_file_name, 'w') do |f|
    f.write(xml_data)
  end
end

.get_failure_type(str) ⇒ Object



78
79
80
81
82
# File 'lib/assets/junit_parser.rb', line 78

def self.get_failure_type(str)
  failure_type = str[/\[(.*?)\]/, 1]
  failure_type = '-W' if failure_type.nil?
  failure_type
end

.insert_attribute(attribute, value) ⇒ Object



70
71
72
# File 'lib/assets/junit_parser.rb', line 70

def self.insert_attribute(attribute, value)
  value == '' ? '' : "#{attribute}='#{value}'"
end

.parse_code_duplications(data_hash) ⇒ Object



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/assets/junit_parser.rb', line 219

def self.parse_code_duplications(data_hash)
  xml = ''
  duplications = data_hash['pmd_cpd']['duplication']
  if duplications.kind_of?(Array)
    index = 1
    duplications.each do |error|
      parsed_files = parse_inspected_files(error['file'])
      failure = add_failure("lines:#{error['lines']} tokens:#{error['tokens']} #{xml_level(3)}files:#{parsed_files}", '', "\n#{add_code(error['codefragment'])}")
      xml += add_failed_testcase("duplication #{index}", failure)
      index += 1
    end
  else
    parsed_files = parse_inspected_files(duplications['file'])
    failure = add_failure("lines:#{duplications['lines']} tokens:#{duplications['tokens']} #{xml_level(3)}files:#{parsed_files}", '',
                          "\n #{add_code(duplications['codefragment'])}")
    xml += add_failed_testcase('single duplication', failure)
  end
  xml
end

.parse_inspected_files(file_list) ⇒ Object



239
240
241
242
243
244
245
246
247
# File 'lib/assets/junit_parser.rb', line 239

def self.parse_inspected_files(file_list)
  index = 1
  file_list_info = []
  file_list.each do |file|
    file_list_info.push("File #{index}: #{file['path']}::#{file['line']}")
    index += 1
  end
  file_list_info
end

.parse_json(file) ⇒ Object

Rubocop-json Parser ================


162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/assets/junit_parser.rb', line 162

def self.parse_json(file)
  data_read = File.read(file)
  data_hash = Crack::JSON.parse(data_read)

  keys = data_hash['metadata'].keys.zip(data_hash['summary'].keys).flatten.compact
  values = data_hash['metadata'].values.zip(data_hash['summary'].values).flatten.compact
  properties = add_properties(keys, values)

  testcase = parse_main_json(data_hash)

  properties + testcase
end

.parse_location(location) ⇒ Object



199
200
201
# File 'lib/assets/junit_parser.rb', line 199

def self.parse_location(location)
  "#{location['line']}:#{location['column']}:#{location['length']}"
end

.parse_main_json(data_hash) ⇒ Object

create main xml content



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/assets/junit_parser.rb', line 176

def self.parse_main_json(data_hash)
  xml = ''
  data_hash['files'].each do |inspected_file|
    error_text = ''
    errors = inspected_file['offenses']
    if errors.empty?
      xml += add_success_testcase((inspected_file['path']).to_s)
    else
      errors.each do |error|
        error_text += construct_failure_mes(
          ['Error isCorrected', 'Error ClassType', 'Error Line', 'Error Message'],
          [error['corrected'], "#{error['cop_name']} (#{error['severity']})",
           parse_location(error['location']), error['message'].tr("\n", '')]
        )
      end
      # TODO: corrected:6 failded:0 (if needed this info)
      failures = add_failure('lineformat=line:column:length', '', error_text)
      xml += add_failed_testcase((inspected_file['path']).to_s, failures)
    end
  end
  xml
end

.parse_xcode_log(file, project, is_warn) ⇒ Object

Xcode-log Parser ================


104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/assets/junit_parser.rb', line 104

def self.parse_xcode_log(file, project, is_warn)
  if is_warn
    error_text = ''
    temp_testcase = ''
    File.open(file).each do |line|
      if line =~ /warning:|error:|BCEROR/
      failure_type = get_failure_type(line)
        warning_params = line.split(':')
        if warning_params.count == 5
           error_text = construct_failure_mes(
            ['Error ClassType', 'Error Message'],
            [failure_type, warning_params[4].tr("\n", '')]
          )
          testcase_name = project+':'+warning_params[0].tr('<', '').tr('>', '')+
             ":#{warning_params[1]}:#{warning_params[2]}"
        else
          error_text = construct_failure_mes(
            ['Error ClassType', 'Error Message'],
            [failure_type, line.tr("\n", '').gsub('warning:','')]
          )
          testcase_name = project
          testcase_name += ':project configuration' if line =~ /BCEROR/
          file_info = check_for_file_info(warning_params)
          testcase_name += ":#{file_info[0]}" unless file_info[0]==nil
          testcase_name += ":#{file_info[1]}" unless file_info[1]==nil
        end
        failures = add_failure('', '', error_text)
        temp_testcase += add_failed_testcase(testcase_name, failures)
      end
    end
    temp_testcase
  else
    add_success_testcase(project)
  end
end

.parse_xml(file) ⇒ Object

CPD-xml Parser ==================


207
208
209
210
211
212
213
214
215
216
217
# File 'lib/assets/junit_parser.rb', line 207

def self.parse_xml(file)
  data_read = File.read(file)
  data_hash = Crack::XML.parse(data_read)

  if data_hash.empty? or data_hash['pmd_cpd']==nil
    puts 'empty data_hash'
    add_success_testcase('casino duplications')
  else
    parse_code_duplications(data_hash)
  end
end

.xml_level(level) ⇒ Object



84
85
86
87
88
89
90
91
92
# File 'lib/assets/junit_parser.rb', line 84

def self.xml_level(level)
  levelstr = "\n"
  i = 1
  while i < level
    levelstr += "\s\s"
    i += 1
  end
  levelstr
end