Files
shields/services/puppetforge/puppetforge-modules.service.js
Paul Melnikow 5026221e84 Provide better dev feedback by validating services when they are loaded (#2769)
It's easy to push services that don't validate, because much of the tooling, including the service test runner and the service definition generator, do not validate all the services. This leads to errors that manifest in CI. It would be more helpful to see these errors sooner.

This moves the `validateDefinition()` check to `loadServiceClasses()`, where the services are first loaded, and fixes related validation errors.
2019-01-15 15:39:13 -05:00

239 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict'
const LegacyService = require('../legacy-service')
const {
makeBadgeData: getBadgeData,
makeLabel: getLabel,
} = require('../../lib/badge-data')
const { metric, addv: versionText } = require('../../lib/text-formatters')
const {
version: versionColor,
coveragePercentage: coveragePercentageColor,
downloadCount: downloadCountColor,
} = require('../../lib/color-formatters')
class PuppetforgeModuleVersion extends LegacyService {
static get category() {
return 'version'
}
static get route() {
return {
base: 'puppetforge/v',
}
}
static get examples() {
return [
{
title: 'Puppet Forge',
previewUrl: 'vStone/percona',
},
]
}
static registerLegacyRouteHandler() {}
}
class PuppetforgeModulePdkVersion extends LegacyService {
static get category() {
return 'platform-support'
}
static get route() {
return {
base: 'puppetforge/pdk-version',
}
}
static get examples() {
return [
{
title: 'Puppet Forge PDK version',
pattern: ':user/:moduleName',
namedParams: {
user: 'tragiccode',
moduleName: 'azure_key_vault',
},
staticPreview: {
label: 'pdk version',
message: 'v1.7.1',
color: 'blue',
},
},
]
}
static registerLegacyRouteHandler() {}
}
class PuppetforgeModuleDownloads extends LegacyService {
static get category() {
return 'downloads'
}
static get route() {
return {
base: 'puppetforge/dt',
}
}
static get examples() {
return [
{
title: 'Puppet Forge',
previewUrl: 'camptocamp/openldap',
},
]
}
static registerLegacyRouteHandler() {}
}
class PuppetforgeModuleEndorsement extends LegacyService {
static get category() {
return 'rating'
}
static get route() {
return {
base: 'puppetforge/e',
}
}
static get examples() {
return [
{
title: 'Puppet Forge',
previewUrl: 'camptocamp/openssl',
},
]
}
static registerLegacyRouteHandler() {}
}
class PuppetforgeModuleFeedback extends LegacyService {
static get category() {
return 'rating'
}
static get route() {
return {
base: 'puppetforge/f',
}
}
static get examples() {
return [
{
title: 'Puppet Forge',
previewUrl: 'camptocamp/openssl',
},
]
}
static registerLegacyRouteHandler() {}
}
// 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.
class PuppetforgeModules extends LegacyService {
static get category() {
return 'other'
}
static registerLegacyRouteHandler({ camp, cache }) {
camp.route(
/^\/puppetforge\/([^/]+)\/([^/]+)\/([^/]+)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
const info = match[1] // either `v`, `dt`, `e`, `f`, or `p`
const user = match[2]
const module = match[3]
const format = match[4]
const options = {
json: true,
uri: `https://forgeapi.puppetlabs.com/v3/modules/${user}-${module}`,
}
const badgeData = getBadgeData('puppetforge', data)
request(options, (err, res, json) => {
if (err != null || (json.length !== undefined && json.length === 0)) {
badgeData.text[1] = 'inaccessible'
sendBadge(format, badgeData)
return
}
try {
if (info === 'v') {
if (json.current_release) {
const version = json.current_release.version
badgeData.text[1] = versionText(version)
badgeData.colorscheme = versionColor(version)
} else {
badgeData.text[1] = 'none'
badgeData.colorscheme = 'lightgrey'
}
} else if (info === 'dt') {
const total = json.downloads
badgeData.colorscheme = downloadCountColor(total)
badgeData.text[0] = getLabel('downloads', data)
badgeData.text[1] = metric(total)
} else if (info === 'e') {
const endorsement = json.endorsement
if (endorsement === 'approved') {
badgeData.colorscheme = 'green'
} else if (endorsement === 'supported') {
badgeData.colorscheme = 'brightgreen'
} else {
badgeData.colorscheme = 'red'
}
badgeData.text[0] = getLabel('endorsement', data)
if (endorsement != null) {
badgeData.text[1] = endorsement
} else {
badgeData.text[1] = 'none'
}
} else if (info === 'f') {
const feedback = json.feedback_score
badgeData.text[0] = getLabel('score', data)
if (feedback != null) {
badgeData.text[1] = `${feedback}%`
badgeData.colorscheme = coveragePercentageColor(feedback)
} else {
badgeData.text[1] = 'unknown'
badgeData.colorscheme = 'lightgrey'
}
} else if (info === 'pdk-version') {
badgeData.text[0] = 'pdk version'
if (json.current_release.pdk) {
const pdkVersion = json.current_release.metadata['pdk-version']
badgeData.text[1] = versionText(pdkVersion)
badgeData.colorscheme = versionColor(pdkVersion)
} else {
badgeData.text[1] = 'none'
badgeData.colorscheme = 'lightgrey'
}
}
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
})
)
}
}
module.exports = {
PuppetforgeModuleVersion,
PuppetforgeModulePdkVersion,
PuppetforgeModuleDownloads,
PuppetforgeModuleFeedback,
PuppetforgeModuleEndorsement,
PuppetforgeModules,
}