Various GitHub Onebox improvements (#13163)

* FIX: Improve GitHub folder regexp in Onebox

It used to match any GitHub URL that was not matched by the other GitHub
Oneboxes and it did not do a good job at handling those. With this
change, the generic Onebox will handle the remaining URLs.

* FEATURE: Add Onebox for GitHub Actions

* FEATURE: Add Onebox for PR check runs

* FIX: Remove image from GitHub folder Oneboxes

It is a generic, auto-generated image which does not provide any value.

* DEV: Add tests

* FIX: Strip HTML comments from PR body
This commit is contained in:
Dan Ungureanu
2021-05-27 12:38:42 +03:00
committed by GitHub
parent 2f12c0f5bd
commit 723d7de18c
13 changed files with 886 additions and 20 deletions

View File

@ -0,0 +1,87 @@
# frozen_string_literal: true
require_relative '../mixins/github_body'
module Onebox
module Engine
class GithubActionsOnebox
include Engine
include LayoutSupport
include JSON
matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/(actions\/runs\/[[:digit:]]+|pull\/[[:digit:]]*\/checks\?check_run_id=[[:digit:]]+)/)
always_https
def url
if type == :actions_run
"https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/actions/runs/#{match[:run_id]}"
elsif type == :pr_run
"https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/check-runs/#{match[:check_run_id]}"
end
end
def self.priority
90 # overlaps with GithubPullRequestOnebox
end
private
def match_url
return if defined?(@match) && defined?(@type)
if match = @url.match(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/actions\/runs\/(?<run_id>[[:digit:]]+)/)
@match = match
@type = :actions_run
end
if match = @url.match(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?<org>.+)\/(?<repo>.+)\/pull\/(?<pr_id>[[:digit:]]*)\/checks\?check_run_id=(?<check_run_id>[[:digit:]]+)/)
@match = match
@type = :pr_run
end
end
def match
return @match if defined?(@match)
match_url
@match
end
def type
return @type if defined?(@type)
match_url
@type
end
def data
status = "unknown"
if raw["status"] == "completed"
if raw["conclusion"] == "success"
status = "success"
elsif raw["conclusion"] == "failure"
status = "failure"
elsif raw["conclusion"] == "cancelled"
end
elsif raw["status"] == "in_progress"
status = "pending"
end
title = if type == :actions_run
raw["head_commit"]["message"].lines.first
elsif type == :pr_run
pr_url = "https://api.github.com/repos/#{match[:org]}/#{match[:repo]}/pulls/#{match[:pr_id]}"
::MultiJson.load(URI.open(pr_url, read_timeout: timeout))["title"]
end
{
link: @url,
title: title,
name: raw["name"],
run_number: raw["run_number"],
status => true,
}
end
end
end
end

View File

@ -7,14 +7,9 @@ module Onebox
include StandardEmbed
include LayoutSupport
matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com[\:\d]*(\/[^\/]+){2}/)
matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com[\:\d]*(\/[^\/]+){2}\/tree/)
always_https
def self.priority
# This engine should have lower priority than the other Github engines
150
end
private
def data
@ -46,7 +41,6 @@ module Onebox
{
link: url,
image: og.image,
title: Onebox::Helpers.truncate(title, 250),
path: display_path,
description: display_description,

View File

@ -9,17 +9,18 @@ module Onebox
end
module InstanceMethods
GITHUB_COMMENT_REGEX = /(<!--.*?-->\r\n)/
GITHUB_COMMENT_REGEX = /<!--.*?-->/
MAX_BODY_LENGTH = 80
def compute_body(body)
body = body.dup
excerpt = nil
body = (body || '').gsub(GITHUB_COMMENT_REGEX, '')
body = body.length > 0 ? body : nil
if body && body.length > MAX_BODY_LENGTH
excerpt = body[MAX_BODY_LENGTH..body.length].rstrip
body = body[0..MAX_BODY_LENGTH - 1]
def compute_body(body)
if body
body = body.gsub(GITHUB_COMMENT_REGEX, '').strip
if body.length == 0
body = nil
elsif body.length > MAX_BODY_LENGTH
excerpt = body[MAX_BODY_LENGTH..body.length].rstrip
body = body[0..MAX_BODY_LENGTH - 1]
end
end
[body, excerpt]

View File

@ -0,0 +1,31 @@
<div class="github-row">
<div class="github-icon-container" title="Commit">
{{#success}}
<svg width="24" height="24" class="github-icon github-icon-success" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm16.28-2.72a.75.75 0 00-1.06-1.06l-5.97 5.97-2.47-2.47a.75.75 0 00-1.06 1.06l3 3a.75.75 0 001.06 0l6.5-6.5z"></path></svg>
{{/success}}
{{#pending}}
<svg width="24" height="24" class="github-icon github-icon-pending" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 18a6 6 0 100-12 6 6 0 000 12z"></path></svg>
{{/pending}}
{{#failure}}
<svg width="24" height="24" class="github-icon github-icon-failure" viewBox="0 0 24 24" aria-hidden="true"><path fill-rule="evenodd" d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12zm8.036-4.024a.75.75 0 00-1.06 1.06L10.939 12l-2.963 2.963a.75.75 0 101.06 1.06L12 13.06l2.963 2.964a.75.75 0 001.061-1.06L13.061 12l2.963-2.964a.75.75 0 10-1.06-1.06L12 10.939 9.036 7.976z"></path></svg>
{{/failure}}
{{#unknown}}
<svg width="24" height="24" class="github-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 18a6 6 0 100-12 6 6 0 000 12z"></path></svg>
{{/unknown}}
</div>
<div class="github-info-container">
<h4>
<a href="{{link}}" target="_blank" rel="noopener">{{title}}</a>
</h4>
{{#run_number}}
<div class="github-info">
{{name}} <span class="github-run-number">#{{run_number}}</span>
</div>
{{/run_number}}
</div>
</div>

View File

@ -1,5 +1,3 @@
{{#image}}<img src="{{image}}" class="thumbnail"/>{{/image}}
<h3><a href="{{link}}" target="_blank" rel="noopener">{{title}}</a></h3>
{{#path}}