Rewrite [githubcommitssince]; also test [githubrelease] (#3350)

This commit is contained in:
Paul Melnikow
2019-04-22 18:54:58 -05:00
committed by GitHub
parent aa32f48765
commit f13326dddf
3 changed files with 83 additions and 109 deletions

View File

@@ -1,20 +1,15 @@
'use strict'
const LegacyService = require('../legacy-service')
const {
makeBadgeData: getBadgeData,
makeLabel: getLabel,
} = require('../../lib/badge-data')
const { makeLogo: getLogo } = require('../../lib/logos')
const { documentation } = require('./github-helpers')
const Joi = require('joi')
const { metric } = require('../text-formatters')
const { nonNegativeInteger } = require('../validators')
const { GithubAuthService } = require('./github-auth-service')
const { fetchLatestRelease } = require('./github-common-fetch')
const { documentation, errorMessagesFor } = require('./github-helpers')
// This legacy service should be rewritten to use e.g. BaseJsonService.
//
// Tips for rewriting:
// https://github.com/badges/shields/blob/master/doc/rewriting-services.md
//
// Do not base new services on this code.
module.exports = class GithubCommitsSince extends LegacyService {
const schema = Joi.object({ ahead_by: nonNegativeInteger }).required()
module.exports = class GithubCommitsSince extends GithubAuthService {
static get category() {
return 'activity'
}
@@ -35,11 +30,10 @@ module.exports = class GithubCommitsSince extends LegacyService {
repo: 'subtitleedit',
version: '3.4.7',
},
staticPreview: {
label: 'commits since 3.4.7',
message: '4225',
color: 'blue',
},
staticPreview: this.render({
version: '3.4.7',
commitCount: 4225,
}),
documentation,
},
{
@@ -49,71 +43,44 @@ module.exports = class GithubCommitsSince extends LegacyService {
repo: 'subtitleedit',
version: 'latest',
},
staticPreview: {
label: 'commits since 3.5.7',
message: '157',
color: 'blue',
},
staticPreview: this.render({
version: '3.5.7',
commitCount: 157,
}),
documentation,
},
]
}
static registerLegacyRouteHandler({ camp, cache, githubApiProvider }) {
camp.route(
/^\/github\/commits-since\/([^/]+)\/([^/]+)\/([^/]+)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
const user = match[1] // eg, SubtitleEdit
const repo = match[2] // eg, subtitleedit
const version = match[3] // eg, 3.4.7 or latest
const format = match[4]
const badgeData = getBadgeData(`commits since ${version}`, data)
static get defaultBadgeData() {
return {
label: 'github',
namedLogo: 'github',
}
}
function setCommitsSinceBadge(user, repo, version) {
const apiUrl = `/repos/${user}/${repo}/compare/${version}...master`
if (badgeData.template === 'social') {
badgeData.logo = getLogo('github', data)
}
githubApiProvider.request(request, apiUrl, {}, (err, res, buffer) => {
if (err != null) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
static render({ version, commitCount }) {
return {
label: `commits since ${version}`,
message: metric(commitCount),
color: 'blue',
}
}
try {
const result = JSON.parse(buffer)
badgeData.text[1] = result.ahead_by
badgeData.colorscheme = 'blue'
badgeData.text[0] = getLabel(`commits since ${version}`, data)
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
}
async handle({ user, repo, version }) {
if (version === 'latest') {
;({ tag_name: version } = await fetchLatestRelease(this, {
user,
repo,
}))
}
if (version === 'latest') {
const url = `/repos/${user}/${repo}/releases/latest`
githubApiProvider.request(request, url, {}, (err, res, buffer) => {
if (err != null) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
try {
const data = JSON.parse(buffer)
setCommitsSinceBadge(user, repo, data.tag_name)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
} else {
setCommitsSinceBadge(user, repo, version)
}
})
)
const { ahead_by: commitCount } = await this._requestJson({
schema,
url: `/repos/${user}/${repo}/compare/${version}...master`,
errorMessages: errorMessagesFor('repo or version not found'),
})
return this.constructor.render({ version, commitCount })
}
}

View File

@@ -59,7 +59,40 @@ async function fetchJsonFromRepo(
}
}
const releaseInfoSchema = Joi.object({
tag_name: Joi.string().required(),
prerelease: Joi.boolean().required(),
}).required()
const releaseInfoArraySchema = Joi.array()
.items(releaseInfoSchema)
.required()
async function fetchLatestRelease(
serviceInstance,
{ user, repo, includePre = false }
) {
const commonAttrs = {
errorMessages: errorMessagesFor('no releases or repo not found'),
}
if (includePre) {
const [releaseInfo] = await serviceInstance._requestJson({
schema: releaseInfoArraySchema,
url: `/repos/${user}/${repo}/releases`,
...commonAttrs,
})
return releaseInfo
} else {
const releaseInfo = await serviceInstance._requestJson({
schema: releaseInfoSchema,
url: `/repos/${user}/${repo}/releases/latest`,
...commonAttrs,
})
return releaseInfo
}
}
module.exports = {
fetchIssue,
fetchJsonFromRepo,
fetchLatestRelease,
}

View File

@@ -1,17 +1,9 @@
'use strict'
const Joi = require('joi')
const { addv } = require('../text-formatters')
const { fetchLatestRelease } = require('./github-common-fetch')
const { GithubAuthService } = require('./github-auth-service')
const { errorMessagesFor, documentation } = require('./github-helpers')
const releaseInfoSchema = Joi.object({
tag_name: Joi.string().required(),
prerelease: Joi.boolean().required(),
}).required()
const releaseInfoArraySchema = Joi.array()
.items(releaseInfoSchema)
.required()
const { documentation } = require('./github-helpers')
module.exports = class GithubRelease extends GithubAuthService {
static get category() {
@@ -40,27 +32,6 @@ module.exports = class GithubRelease extends GithubAuthService {
]
}
async fetch({ user, repo, includePre }) {
const commonAttrs = {
errorMessages: errorMessagesFor('no releases or repo not found'),
}
if (includePre) {
const [releaseInfo] = await this._requestJson({
schema: releaseInfoArraySchema,
url: `/repos/${user}/${repo}/releases`,
...commonAttrs,
})
return releaseInfo
} else {
const releaseInfo = await this._requestJson({
schema: releaseInfoSchema,
url: `/repos/${user}/${repo}/releases/latest`,
...commonAttrs,
})
return releaseInfo
}
}
static get defaultBadgeData() {
return {
label: 'release',
@@ -76,7 +47,10 @@ module.exports = class GithubRelease extends GithubAuthService {
}
async handle({ which, user, repo }) {
const { tag_name: version, prerelease: isPrerelease } = await this.fetch({
const {
tag_name: version,
prerelease: isPrerelease,
} = await fetchLatestRelease(this, {
user,
repo,
includePre: which === 'release-pre',