Skip to content

Commit

Permalink
Add homebrew downloads badge
Browse files Browse the repository at this point in the history
  • Loading branch information
kdheepak committed Feb 21, 2021
1 parent 1adfbe4 commit 38170eb
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 5 deletions.
71 changes: 71 additions & 0 deletions services/homebrew/homebrew-downloads.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
'use strict'

const Joi = require('joi')
const { downloadCount } = require('../color-formatters')
const { metric } = require('../text-formatters')
const { BaseJsonService } = require('..')
const { nonNegativeInteger } = require('../validators')

const schema = Joi.object({
analytics: Joi.object({
install: Joi.object({
'30d': Joi.object().required(),
'90d': Joi.object().required(),
'365d': Joi.object().required(),
}).required(),
}).required(),
}).required()

const periodMap = {
dm: {
api_field: '30d',
suffix: '/month',
},
dy: {
api_field: '365d',
suffix: '/year',
},
}

module.exports = class Homebrew extends BaseJsonService {
static category = 'downloads'

static route = {
base: 'homebrew/downloads',
pattern: ':period(dm|dy)/:formula',
}

static render({ period, downloads }) {
return {
message: `${metric(downloads)}${periodMap[period].suffix}`,
color: downloadCount(downloads),
}
}

static examples = [
{
title: 'homebrew downloads',
namedParams: { period: 'dm', formula: 'cake' },
staticPreview: this.render({ period: 'dm', downloads: 93 }),
},
]

static defaultBadgeData = { label: 'downloads' }

async fetch({ formula }) {
return this._requestJson({
schema,
url: `https://formulae.brew.sh/api/formula/${formula}.json`,
errorMessages: { 404: 'package not found' },
})
}

async handle({ period, formula }) {
const data = await this.fetch({ formula })
return this.constructor.render({
period,
downloads:
data.analytics['install'][periodMap[period].api_field][formula],
})
}
}
20 changes: 20 additions & 0 deletions services/homebrew/homebrew-downloads.tester.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict'

const t = (module.exports = require('../tester').createServiceTester())
const { isMetricOverTimePeriod } = require('../test-validators')

t.create('daily downloads (valid)')
.get('/dm/cake.json')
.expectBadge({ label: 'downloads', message: isMetricOverTimePeriod })

t.create('yearly downloads (valid)')
.get('/dy/cake.json')
.expectBadge({ label: 'downloads', message: isMetricOverTimePeriod })

t.create('daily downloads (not found)')
.get('/dm/not-a-package.json')
.expectBadge({ label: 'downloads', message: 'package not found' })

t.create('yearly downloads (not found)')
.get('/dy/not-a-package.json')
.expectBadge({ label: 'downloads', message: 'package not found' })
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ module.exports = class Homebrew extends BaseJsonService {

static examples = [
{
title: 'homebrew',
title: 'homebrew version',
namedParams: { formula: 'cake' },
staticPreview: renderVersionBadge({ version: 'v0.32.0' }),
},
]

static defaultBadgeData = { label: 'homebrew' }
static defaultBadgeData = { label: 'version' }

async fetch({ formula }) {
return this._requestJson({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const { isVPlusTripleDottedVersion } = require('../test-validators')
const t = (module.exports = require('../tester').createServiceTester())

t.create('homebrew (valid)').get('/cake.json').expectBadge({
label: 'homebrew',
label: 'version',
message: isVPlusTripleDottedVersion,
})

Expand All @@ -15,8 +15,8 @@ t.create('homebrew (valid)')
.get('/api/formula/cake.json')
.reply(200, { versions: { stable: '0.23.0', devel: null, head: null } })
)
.expectBadge({ label: 'homebrew', message: 'v0.23.0' })
.expectBadge({ label: 'version', message: 'v0.23.0' })

t.create('homebrew (not found)')
.get('/not-a-package.json')
.expectBadge({ label: 'homebrew', message: 'not found' })
.expectBadge({ label: 'version', message: 'not found' })

0 comments on commit 38170eb

Please sign in to comment.