lib/lazylead/task/accuracy/stacktrace.rb in lazylead-0.5.2 vs lib/lazylead/task/accuracy/stacktrace.rb in lazylead-0.6.0

- old
+ new

@@ -32,27 +32,67 @@ "Description" end def passed(issue) return false if issue.description.nil? - !frames(issue.description).select { |f| oracle?(f) || java?(f) }.empty? + frames(issue.description).any? { |f| oracle?(f) || java?(f) } end - # Detect all {noformat} frames in description field + # Detect all {noformat}, {code} frames in ticket description def frames(description) - description.enum_for(:scan, /(?={noformat})/) - .map { Regexp.last_match.offset(0).first } - .each_slice(2).map do |f| - description[f.first, f.last - f.first + "{noformat}".size] + noformat(description).concat(code(description)) + end + + # Detect all noformat blocks and give all text snippets in array + # @param desc The jira ticket description + def noformat(desc) + return [] unless desc.match?(/{(n|N)(o|O)(f|F)(o|O)(r|R)(m|M)(a|A)(t|T)}/) + desc.enum_for(:scan, /(?=\{(n|N)(o|O)(f|F)(o|O)(r|R)(m|M)(a|A)(t|T)})/) + .map { Regexp.last_match.offset(0).first } + .each_slice(2).map do |f| + desc[f.first, f.last - f.first + "{noformat}".size] end end + # Detect all {code:*} blocks and give all text snippets in array + # @param desc The jira ticket description + def code(desc) + return [] unless desc.match?(/{(c|C)(o|O)(d|D)(e|E)(:\S+)?}/) + words = desc.gsub(/{(c|C)(o|O)(d|D)(e|E)/, " {code") + .gsub("}", "} ") + .gsub("Caused by:", "Caused_by:") + .split(" ") + .map(&:strip) + .reject(&:blank?) + pairs(words, "{code").map { |s| words[s.first..s.last].join("\n") } + end + + # Detect indexes of pairs which are starting from particular text + # @param words is array of words + # @param text is a label for pairs + # + # paris([aa,tag,bb,cc,tag,dd], "tag") => [[1, 4]] + # paris([aa,tag,bb,cc,tag,dd,tag,ee], "tag") => [[1, 4]] # non closed + # + def pairs(words, text) + snippets = [[]] + words.each_with_index do |e, i| + next unless e.start_with? text + pair = snippets.last + pair << i if pair.size.zero? || pair.size == 1 + snippets[-1] = pair + snippets << [] if pair.size == 2 + end + snippets.select { |s| s.size == 2 } + end + # @return true if frame has few lines with java stack frames def java?(frame) - allowed = ["at ", "Caused by:"] - frame.split("\n") - .map(&:strip) - .count { |l| allowed.any? { |a| l.start_with? a } } > 3 + allowed = ["at", "Caused by:", "Caused_by:"] + frame.match?(/\s\S+\.\S+Exception:\s/) || + frame.split("\n") + .map(&:strip) + .count { |l| allowed.any? { |a| l.start_with? a } } > 3 end # @return true if frame has Oracle error # @see https://docs.oracle.com/pls/db92/db92.error_search def oracle?(frame)