1
0
mirror of https://github.com/badges/shields.git synced 2025-07-30 17:23:07 +03:00

refactor [cocoapods] service (#2977)

* refactor [cocoapods] service

* remove pointless default

* move join to render()
This commit is contained in:
chris48s
2019-02-13 02:14:36 +00:00
committed by Caleb Cartwright
parent e1a50a7246
commit b87d67bb18
11 changed files with 145 additions and 221 deletions

View File

@ -0,0 +1,25 @@
'use strict'
const Joi = require('joi')
const { BaseJsonService } = require('..')
const schema = Joi.object({
version: Joi.string().required(),
license: Joi.alternatives(
Joi.string().required(),
Joi.object({
type: Joi.string().required(),
}).required()
).required(),
// https://github.com/badges/shields/pull/209
platforms: Joi.object().default({ ios: '5.0', osx: '10.7' }),
}).required()
module.exports = class BaseCocoaPodsService extends BaseJsonService {
async fetch({ spec }) {
return this._requestJson({
schema,
url: `https://trunk.cocoapods.org/api/v1/pods/${spec}/specs/latest`,
})
}
}

View File

@ -0,0 +1,62 @@
'use strict'
const {
coveragePercentage: coveragePercentageColor,
} = require('../../lib/color-formatters')
const Joi = require('joi')
const { BaseJsonService } = require('..')
const schema = Joi.object({
cocoadocs: Joi.object({
doc_percent: Joi.number()
.allow(null)
.required(),
}).required(),
}).required()
module.exports = class CocoapodsDocs extends BaseJsonService {
static get category() {
return 'analysis'
}
static get route() {
return {
base: 'cocoapods/metrics/doc-percent',
pattern: ':spec',
}
}
static get examples() {
return [
{
title: 'Cocoapods doc percentage',
namedParams: { spec: 'AFNetworking' },
staticPreview: this.render({ percentage: 94 }),
},
]
}
async fetch({ spec }) {
return this._requestJson({
schema,
url: `https://metrics.cocoapods.org/api/v1/pods/${spec}`,
})
}
static render({ percentage }) {
return {
message: `${percentage}%`,
color: coveragePercentageColor(percentage),
}
}
async handle({ spec }) {
const data = await this.fetch({ spec })
const percentage = data.cocoadocs.doc_percent || 0
return this.constructor.render({ percentage })
}
static get defaultBadgeData() {
return { label: 'docs' }
}
}

View File

@ -1,7 +1,6 @@
'use strict' 'use strict'
const Joi = require('joi') const Joi = require('joi')
const { invalidJSON } = require('../response-fixtures')
const { isIntegerPercentage } = require('../test-validators') const { isIntegerPercentage } = require('../test-validators')
const t = (module.exports = require('../tester').createServiceTester()) const t = (module.exports = require('../tester').createServiceTester())
@ -27,17 +26,3 @@ t.create('doc percent (null)')
t.create('doc percent (not found)') t.create('doc percent (not found)')
.get('/not-a-package.json') .get('/not-a-package.json')
.expectJSON({ name: 'docs', value: 'not found' }) .expectJSON({ name: 'docs', value: 'not found' })
t.create('doc percent (connection error)')
.get('/AFNetworking.json')
.networkOff()
.expectJSON({ name: 'docs', value: 'inaccessible' })
t.create('doc percent (unexpected response)')
.get('/AFNetworking.json')
.intercept(nock =>
nock('https://metrics.cocoapods.org')
.get('/api/v1/pods/AFNetworking')
.reply(invalidJSON)
)
.expectJSON({ name: 'docs', value: 'invalid' })

View File

@ -1,8 +1,8 @@
'use strict' 'use strict'
const LegacyService = require('../legacy-service') const BaseCocoaPodsService = require('./cocoapods-base')
module.exports = class CocoapodsLicense extends LegacyService { module.exports = class CocoapodsLicense extends BaseCocoaPodsService {
static get category() { static get category() {
return 'license' return 'license'
} }
@ -19,11 +19,27 @@ module.exports = class CocoapodsLicense extends LegacyService {
{ {
title: 'Cocoapods', title: 'Cocoapods',
namedParams: { spec: 'AFNetworking' }, namedParams: { spec: 'AFNetworking' },
staticPreview: { label: 'license', message: 'MIT', color: '000' }, staticPreview: this.render({ license: 'MIT' }),
}, },
] ]
} }
// Legacy route handler is defined in cocoapods.service.js. static render({ license }) {
static registerLegacyRouteHandler() {} return {
message: license,
// https://github.com/badges/shields/pull/184
color: '#373737',
}
}
async handle({ spec }) {
const data = await this.fetch({ spec })
const license =
typeof data.license === 'string' ? data.license : data.license.type
return this.constructor.render({ license })
}
static get defaultBadgeData() {
return { label: 'license' }
}
} }

View File

@ -1,7 +1,5 @@
'use strict' 'use strict'
const { invalidJSON } = require('../response-fixtures')
const t = (module.exports = require('../tester').createServiceTester()) const t = (module.exports = require('../tester').createServiceTester())
t.create('license (valid)') t.create('license (valid)')
@ -11,17 +9,3 @@ t.create('license (valid)')
t.create('license (not found)') t.create('license (not found)')
.get('/not-a-package.json') .get('/not-a-package.json')
.expectJSON({ name: 'license', value: 'not found' }) .expectJSON({ name: 'license', value: 'not found' })
t.create('license (connection error)')
.get('/AFNetworking.json')
.networkOff()
.expectJSON({ name: 'license', value: 'inaccessible' })
t.create('license (unexpected response)')
.get('/AFNetworking.json')
.intercept(nock =>
nock('https://trunk.cocoapods.org')
.get('/api/v1/pods/AFNetworking/specs/latest')
.reply(invalidJSON)
)
.expectJSON({ name: 'license', value: 'invalid' })

View File

@ -1,68 +0,0 @@
'use strict'
const LegacyService = require('../legacy-service')
const { makeBadgeData: getBadgeData } = require('../../lib/badge-data')
const { checkErrorResponse } = require('../../lib/error-helper')
const {
coveragePercentage: coveragePercentageColor,
} = require('../../lib/color-formatters')
// 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 CocoapodsMetrics extends LegacyService {
static get category() {
return 'analysis'
}
static get route() {
return {
base: 'cocoapods/metrics/doc-percent',
pattern: ':spec',
}
}
static get examples() {
return [
{
title: 'Cocoapods doc percentage',
namedParams: { spec: 'AFNetworking' },
staticPreview: { label: 'docs', message: '94%', color: 'green' },
},
]
}
static registerLegacyRouteHandler({ camp, cache }) {
camp.route(
/^\/cocoapods\/metrics\/doc-percent\/(.*)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
const spec = match[1] // eg, AFNetworking
const format = match[2]
const apiUrl = `https://metrics.cocoapods.org/api/v1/pods/${spec}`
const badgeData = getBadgeData('docs', data)
request(apiUrl, (err, res, buffer) => {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData)
return
}
try {
const parsedData = JSON.parse(buffer)
let percentage = parsedData.cocoadocs.doc_percent
if (percentage == null) {
percentage = 0
}
badgeData.colorscheme = coveragePercentageColor(percentage)
badgeData.text[1] = `${percentage}%`
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
})
)
}
}

View File

@ -1,8 +1,8 @@
'use strict' 'use strict'
const LegacyService = require('../legacy-service') const BaseCocoaPodsService = require('./cocoapods-base')
module.exports = class CocoapodsPlatform extends LegacyService { module.exports = class CocoapodsPlatform extends BaseCocoaPodsService {
static get category() { static get category() {
return 'platform-support' return 'platform-support'
} }
@ -19,15 +19,27 @@ module.exports = class CocoapodsPlatform extends LegacyService {
{ {
title: 'Cocoapods platforms', title: 'Cocoapods platforms',
namedParams: { spec: 'AFNetworking' }, namedParams: { spec: 'AFNetworking' },
staticPreview: { staticPreview: this.render({
label: 'platform', platforms: ['ios', 'osx', 'watchos', 'tvos'],
message: 'ios | osx | watchos | tvos', }),
color: 'lightgrey',
},
}, },
] ]
} }
// Legacy route handler is defined in cocoapods.service.js. static render({ platforms }) {
static registerLegacyRouteHandler() {} return {
message: platforms.join(' | '),
// https://github.com/badges/shields/pull/184
color: '#989898',
}
}
async handle({ spec }) {
const { platforms } = await this.fetch({ spec })
return this.constructor.render({ platforms: Object.keys(platforms) })
}
static get defaultBadgeData() {
return { label: 'platform' }
}
} }

View File

@ -1,7 +1,6 @@
'use strict' 'use strict'
const Joi = require('joi') const Joi = require('joi')
const { invalidJSON } = require('../response-fixtures')
const isPlatform = Joi.string().regex( const isPlatform = Joi.string().regex(
/^(osx|ios|tvos|watchos)( \| (osx|ios|tvos|watchos))*$/ /^(osx|ios|tvos|watchos)( \| (osx|ios|tvos|watchos))*$/
@ -22,16 +21,11 @@ t.create('platform (not found)')
.get('/not-a-package.json') .get('/not-a-package.json')
.expectJSON({ name: 'platform', value: 'not found' }) .expectJSON({ name: 'platform', value: 'not found' })
t.create('platform (connection error)') t.create('platform (missing platforms key)')
.get('/AFNetworking.json')
.networkOff()
.expectJSON({ name: 'platform', value: 'inaccessible' })
t.create('platform (unexpected response)')
.get('/AFNetworking.json') .get('/AFNetworking.json')
.intercept(nock => .intercept(nock =>
nock('https://trunk.cocoapods.org') nock('https://trunk.cocoapods.org')
.get('/api/v1/pods/AFNetworking/specs/latest') .get('/api/v1/pods/AFNetworking/specs/latest')
.reply(invalidJSON) .reply(200, { version: 'v1.0', license: 'MIT' })
) )
.expectJSON({ name: 'platform', value: 'invalid' }) .expectJSON({ name: 'platform', value: 'ios | osx' })

View File

@ -1,8 +1,9 @@
'use strict' 'use strict'
const LegacyService = require('../legacy-service') const { renderVersionBadge } = require('../../lib/version')
const BaseCocoaPodsService = require('./cocoapods-base')
module.exports = class CocoapodsVersion extends LegacyService { module.exports = class CocoapodsVersion extends BaseCocoaPodsService {
static get category() { static get category() {
return 'version' return 'version'
} }
@ -18,18 +19,18 @@ module.exports = class CocoapodsVersion extends LegacyService {
return [ return [
{ {
title: 'Cocoapods', title: 'Cocoapods',
namedParams: { namedParams: { spec: 'AFNetworking' },
spec: 'AFNetworking', staticPreview: renderVersionBadge({ version: 'v3.2.1' }),
},
staticPreview: {
label: 'pod',
message: 'v3.2.1',
color: 'blue',
},
}, },
] ]
} }
// Legacy route handler is defined in cocoapods.service.js. async handle({ spec }) {
static registerLegacyRouteHandler() {} const { version } = await this.fetch({ spec })
return renderVersionBadge({ version })
}
static get defaultBadgeData() {
return { label: 'pod' }
}
} }

View File

@ -2,7 +2,6 @@
const Joi = require('joi') const Joi = require('joi')
const { isVPlusDottedVersionAtLeastOne } = require('../test-validators') const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
const { invalidJSON } = require('../response-fixtures')
const t = (module.exports = require('../tester').createServiceTester()) const t = (module.exports = require('../tester').createServiceTester())
@ -18,17 +17,3 @@ t.create('version (valid)')
t.create('version (not found)') t.create('version (not found)')
.get('/not-a-package.json') .get('/not-a-package.json')
.expectJSON({ name: 'pod', value: 'not found' }) .expectJSON({ name: 'pod', value: 'not found' })
t.create('version (connection error)')
.get('/AFNetworking.json')
.networkOff()
.expectJSON({ name: 'pod', value: 'inaccessible' })
t.create('version (unexpected response)')
.get('/AFNetworking.json')
.intercept(nock =>
nock('https://trunk.cocoapods.org')
.get('/api/v1/pods/AFNetworking/specs/latest')
.reply(invalidJSON)
)
.expectJSON({ name: 'pod', value: 'invalid' })

View File

@ -1,72 +0,0 @@
'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')
// 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 CocoapodsVersionPlatformLicense extends LegacyService {
static get category() {
return 'other'
}
static registerLegacyRouteHandler({ camp, cache }) {
camp.route(
/^\/cocoapods\/(v|p|l)\/(.*)\.(svg|png|gif|jpg|json)$/,
cache((data, match, sendBadge, request) => {
const type = match[1]
const spec = match[2] // eg, AFNetworking
const format = match[3]
const apiUrl = `https://trunk.cocoapods.org/api/v1/pods/${spec}/specs/latest`
const typeToLabel = { v: 'pod', p: 'platform', l: 'license' }
const badgeData = getBadgeData(typeToLabel[type], data)
badgeData.colorscheme = undefined
request(apiUrl, (err, res, buffer) => {
if (checkErrorResponse(badgeData, err, res)) {
sendBadge(format, badgeData)
return
}
try {
const parsedData = JSON.parse(buffer)
const version = parsedData.version
let license
if (typeof parsedData.license === 'string') {
license = parsedData.license
} else {
license = parsedData.license.type
}
const platforms = Object.keys(
parsedData.platforms || {
ios: '5.0',
osx: '10.7',
}
).join(' | ')
if (type === 'v') {
badgeData.text[1] = versionText(version)
badgeData.colorscheme = versionColor(version)
} else if (type === 'p') {
badgeData.text[1] = platforms
badgeData.colorB = '#989898'
} else if (type === 'l') {
badgeData.text[1] = license
badgeData.colorB = '#373737'
}
sendBadge(format, badgeData)
} catch (e) {
badgeData.text[1] = 'invalid'
sendBadge(format, badgeData)
}
})
})
)
}
}