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)