lib/danger/request_source/github.rb in danger-2.0.1 vs lib/danger/request_source/github.rb in danger-2.1.0

- old
+ new

@@ -1,12 +1,14 @@ # coding: utf-8 require 'octokit' -require 'redcarpet' +require 'danger/helpers/comments_helper' module Danger module RequestSources class GitHub < RequestSource + include Danger::Helpers::CommentsHelper + attr_accessor :pr_json, :issue_json, :support_tokenless_auth def initialize(ci_source, environment) self.ci_source = ci_source self.environment = environment @@ -30,14 +32,10 @@ def client raise 'No API token given, please provide one using `DANGER_GITHUB_API_TOKEN`' if !@token && !support_tokenless_auth @client ||= Octokit::Client.new(access_token: @token) end - def markdown_parser - @markdown_parser ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, no_intra_emphasis: true) - end - def pr_diff @pr_diff ||= client.pull_request(ci_source.repo_slug, ci_source.pull_request_id, accept: 'application/vnd.github.v3.diff') end def setup_danger_branches @@ -91,11 +89,12 @@ body = generate_comment(warnings: warnings, errors: errors, messages: messages, markdowns: markdowns, previous_violations: previous_violations, - danger_id: danger_id) + danger_id: danger_id, + template: 'github') if editable_issues.empty? comment_result = client.add_comment(ci_source.repo_slug, ci_source.pull_request_id, body) else original_id = editable_issues.first[:id] @@ -110,11 +109,11 @@ details_url: comment_result['html_url']) end def submit_pull_request_status!(warnings: [], errors: [], details_url: []) status = (errors.count.zero? ? 'success' : 'failure') - message = generate_github_description(warnings: warnings, errors: errors) + message = generate_description(warnings: warnings, errors: errors) latest_pr_commit_ref = self.pr_json[:head][:sha] if latest_pr_commit_ref.empty? || latest_pr_commit_ref.nil? raise "Couldn't find a commit to update its status".red @@ -150,96 +149,9 @@ issues.each do |issue| next unless issue[:body].include?("generated_by_#{danger_id}") next if issue[:id] == except client.delete_comment(ci_source.repo_slug, issue[:id]) end - end - - def random_compliment - compliment = ['Well done.', 'Congrats.', 'Woo!', - 'Yay.', 'Jolly good show.', "Good on 'ya.", 'Nice work.'] - compliment.sample - end - - def generate_github_description(warnings: nil, errors: nil) - if errors.empty? && warnings.empty? - return "All green. #{random_compliment}" - else - message = "⚠ " - message += "#{'Error'.danger_pluralize(errors.count)}. " unless errors.empty? - message += "#{'Warning'.danger_pluralize(warnings.count)}. " unless warnings.empty? - message += "Don't worry, everything is fixable." - return message - end - end - - def generate_comment(warnings: [], errors: [], messages: [], markdowns: [], previous_violations: {}, danger_id: 'danger') - require 'erb' - - md_template = File.join(Danger.gem_path, 'lib/danger/comment_generators/github.md.erb') - - # erb: http://www.rrn.dk/rubys-erb-templating-system - # for the extra args: http://stackoverflow.com/questions/4632879/erb-template-removing-the-trailing-line - @tables = [ - table('Error', 'no_entry_sign', errors, previous_violations), - table('Warning', 'warning', warnings, previous_violations), - table('Message', 'book', messages, previous_violations) - ] - @markdowns = markdowns - @danger_id = danger_id - - return ERB.new(File.read(md_template), 0, '-').result(binding) - end - - def table(name, emoji, violations, all_previous_violations) - content = violations.map { |v| process_markdown(v) }.uniq - kind = table_kind_from_title(name) - previous_violations = all_previous_violations[kind] || [] - messages = content.map(&:message) - resolved_violations = previous_violations.uniq - messages - count = content.count - { name: name, emoji: emoji, content: content, resolved: resolved_violations, count: count } - end - - def parse_comment(comment) - tables = parse_tables_from_comment(comment) - violations = {} - tables.each do |table| - next unless table =~ %r{<th width="100%"(.*?)</th>}im - title = Regexp.last_match(1) - kind = table_kind_from_title(title) - next unless kind - - violations[kind] = violations_from_table(table) - end - - violations.reject { |_, v| v.empty? } - end - - def violations_from_table(table) - regex = %r{<td data-sticky="true">(?:<del>)?(.*?)(?:</del>)?\s*</td>}im - table.scan(regex).flatten.map(&:strip) - end - - def table_kind_from_title(title) - if title =~ /error/i - :error - elsif title =~ /warning/i - :warning - elsif title =~ /message/i - :message - end - end - - def parse_tables_from_comment(comment) - comment.split("</table>") - end - - def process_markdown(violation) - html = markdown_parser.render(violation.message) - # Remove the outer `<p>`, the -5 represents a newline + `</p>` - html = html[3...-5] if html.start_with? "<p>" - Violation.new(html, violation.sticky) end # @return [String] The organisation name, is nil if it can't be detected def organisation matched = self.issue_json[:repository_url].match(%r{repos\/(.*)\/})