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\/(.*)\/})