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

.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 = xml_level(0).to_s
  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



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# File 'lib/assets/junit_parser.rb', line 196

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



216
217
218
219
220
221
222
223
224
# File 'lib/assets/junit_parser.rb', line 216

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 ================


139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/assets/junit_parser.rb', line 139

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



176
177
178
# File 'lib/assets/junit_parser.rb', line 176

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

.parse_main_json(data_hash) ⇒ Object

create main xml content



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/assets/junit_parser.rb', line 153

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
# File 'lib/assets/junit_parser.rb', line 104

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

.parse_xml(file) ⇒ Object

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


184
185
186
187
188
189
190
191
192
193
194
# File 'lib/assets/junit_parser.rb', line 184

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