refactor [homebrew] service (#3009)
This commit is contained in:
@@ -1,18 +1,16 @@
|
||||
'use strict'
|
||||
|
||||
const LegacyService = require('../legacy-service')
|
||||
const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
|
||||
const { checkErrorResponse } = require('../../lib/error-helper')
|
||||
const { addv: versionText } = require('../../lib/text-formatters')
|
||||
const { version: versionColor } = require('../../lib/color-formatters')
|
||||
const Joi = require('joi')
|
||||
const { renderVersionBadge } = require('../../lib/version')
|
||||
const { BaseJsonService } = require('..')
|
||||
|
||||
// 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 Homebrew extends LegacyService {
|
||||
const schema = Joi.object({
|
||||
versions: Joi.object({
|
||||
stable: Joi.string().required(),
|
||||
}).required(),
|
||||
}).required()
|
||||
|
||||
module.exports = class Homebrew extends BaseJsonService {
|
||||
static get category() {
|
||||
return 'version'
|
||||
}
|
||||
@@ -29,47 +27,24 @@ module.exports = class Homebrew extends LegacyService {
|
||||
{
|
||||
title: 'homebrew',
|
||||
namedParams: { formula: 'cake' },
|
||||
staticPreview: {
|
||||
label: 'homebrew',
|
||||
message: 'v0.32.0',
|
||||
color: 'orange',
|
||||
},
|
||||
staticPreview: renderVersionBadge({ version: 'v0.32.0' }),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
static registerLegacyRouteHandler({ camp, cache }) {
|
||||
camp.route(
|
||||
/^\/homebrew\/v\/([^/]+)\.(svg|png|gif|jpg|json)$/,
|
||||
cache((data, match, sendBadge, request) => {
|
||||
const pkg = match[1] // eg. cake
|
||||
const format = match[2]
|
||||
const apiUrl = `https://formulae.brew.sh/api/formula/${pkg}.json`
|
||||
static get defaultBadgeData() {
|
||||
return { label: 'homebrew' }
|
||||
}
|
||||
|
||||
const badgeData = getBadgeData('homebrew', data)
|
||||
request(
|
||||
apiUrl,
|
||||
{ headers: { Accept: 'application/json' } },
|
||||
(err, res, buffer) => {
|
||||
if (checkErrorResponse(badgeData, err, res)) {
|
||||
sendBadge(format, badgeData)
|
||||
return
|
||||
}
|
||||
try {
|
||||
const data = JSON.parse(buffer)
|
||||
const version = data.versions.stable
|
||||
async fetch({ formula }) {
|
||||
return this._requestJson({
|
||||
schema,
|
||||
url: `https://formulae.brew.sh/api/formula/${formula}.json`,
|
||||
})
|
||||
}
|
||||
|
||||
badgeData.text[1] = versionText(version)
|
||||
badgeData.colorscheme = versionColor(version)
|
||||
|
||||
sendBadge(format, badgeData)
|
||||
} catch (e) {
|
||||
badgeData.text[1] = 'invalid'
|
||||
sendBadge(format, badgeData)
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
)
|
||||
async handle({ formula }) {
|
||||
const data = await this.fetch({ formula })
|
||||
return renderVersionBadge({ version: data.versions.stable })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
'use strict'
|
||||
|
||||
const Joi = require('joi')
|
||||
const { ServiceTester } = require('../tester')
|
||||
const { isVPlusTripleDottedVersion } = require('../test-validators')
|
||||
const { invalidJSON } = require('../response-fixtures')
|
||||
|
||||
const t = (module.exports = new ServiceTester({
|
||||
id: 'homebrew',
|
||||
title: 'homebrew',
|
||||
}))
|
||||
const t = (module.exports = require('../tester').createServiceTester())
|
||||
|
||||
t.create('homebrew (valid)')
|
||||
.get('/v/cake.json')
|
||||
.get('/cake.json')
|
||||
.expectJSONTypes(
|
||||
Joi.object().keys({
|
||||
name: 'homebrew',
|
||||
@@ -20,7 +14,7 @@ t.create('homebrew (valid)')
|
||||
)
|
||||
|
||||
t.create('homebrew (valid, mocked response)')
|
||||
.get('/v/cake.json')
|
||||
.get('/cake.json')
|
||||
.intercept(nock =>
|
||||
nock('https://formulae.brew.sh')
|
||||
.get('/api/formula/cake.json')
|
||||
@@ -28,20 +22,6 @@ t.create('homebrew (valid, mocked response)')
|
||||
)
|
||||
.expectJSON({ name: 'homebrew', value: 'v0.23.0' })
|
||||
|
||||
t.create('homebrew (invalid)')
|
||||
.get('/v/not-a-package.json')
|
||||
t.create('homebrew (not found)')
|
||||
.get('/not-a-package.json')
|
||||
.expectJSON({ name: 'homebrew', value: 'not found' })
|
||||
|
||||
t.create('homebrew (connection error)')
|
||||
.get('/v/cake.json')
|
||||
.networkOff()
|
||||
.expectJSON({ name: 'homebrew', value: 'inaccessible' })
|
||||
|
||||
t.create('homebrew (unexpected response)')
|
||||
.get('/v/cake.json')
|
||||
.intercept(nock =>
|
||||
nock('https://formulae.brew.sh')
|
||||
.get('/api/formula/cake.json')
|
||||
.reply(invalidJSON)
|
||||
)
|
||||
.expectJSON({ name: 'homebrew', value: 'invalid' })
|
||||
|
||||
Reference in New Issue
Block a user