From 3fec21a028c8dc087ff95efeadb220bc1ec96d58 Mon Sep 17 00:00:00 2001 From: Caleb Cartwright Date: Sun, 9 Jun 2019 16:44:44 -0500 Subject: [PATCH] restore [JitpackDownloads] badge (#3533) * feat: restore JitpackDownloads badge * chore: use interval name in jitpackdownloads --- services/jitpack/jitpack-downloads.service.js | 89 ++++++++++++++++--- services/jitpack/jitpack-downloads.tester.js | 31 ++++--- 2 files changed, 94 insertions(+), 26 deletions(-) diff --git a/services/jitpack/jitpack-downloads.service.js b/services/jitpack/jitpack-downloads.service.js index 1af4244a47..ff268566d3 100644 --- a/services/jitpack/jitpack-downloads.service.js +++ b/services/jitpack/jitpack-downloads.service.js @@ -1,14 +1,83 @@ 'use strict' -const { deprecatedService } = require('..') +const Joi = require('joi') +const { nonNegativeInteger } = require('../validators') +const { BaseJsonService } = require('..') +const { downloadCount } = require('../color-formatters') +const { metric } = require('../text-formatters') -module.exports = deprecatedService({ - route: { - base: 'jitpack', - pattern: ':period(dw|dm)/:various*', +const schema = Joi.object({ + week: nonNegativeInteger, + month: nonNegativeInteger, +}).required() + +const intervalMap = { + dw: { + api_field: 'week', + suffix: '/week', }, - message: 'temporarily unavailable', - label: 'downloads', - category: 'downloads', - dateAdded: new Date('2019-05-27'), -}) + dm: { + api_field: 'month', + suffix: '/month', + }, +} + +module.exports = class JitpackDownloads extends BaseJsonService { + static get category() { + return 'downloads' + } + + static get route() { + return { + base: 'jitpack', + pattern: + ':interval(dw|dm)/:vcs(github|bitbucket|gitlab|gitee)/:user/:repo', + } + } + + static get examples() { + return [ + { + title: 'JitPack - Downloads', + namedParams: { + interval: 'dm', + vcs: 'github', + user: 'jitpack', + repo: 'maven-simple', + }, + staticPreview: JitpackDownloads.render({ + downloads: 14000, + interval: 'dm', + }), + keywords: ['java', 'maven'], + }, + ] + } + + static get defaultBadgeData() { + return { label: 'downloads' } + } + + static render({ downloads, interval }) { + return { + message: `${metric(downloads)}${intervalMap[interval].suffix}`, + color: downloadCount(downloads), + } + } + + async fetch({ vcs, user, repo }) { + return this._requestJson({ + schema, + url: `https://jitpack.io/api/downloads/com.${vcs}.${user}/${repo}`, + errorMessages: { 401: 'project not found or private' }, + }) + } + + async handle({ interval, vcs, user, repo }) { + const json = await this.fetch({ vcs, user, repo }) + return this.constructor.render({ + downloads: json[intervalMap[interval].api_field], + interval, + }) + } +} diff --git a/services/jitpack/jitpack-downloads.tester.js b/services/jitpack/jitpack-downloads.tester.js index 8e72cb530c..a86536ae14 100644 --- a/services/jitpack/jitpack-downloads.tester.js +++ b/services/jitpack/jitpack-downloads.tester.js @@ -1,23 +1,22 @@ 'use strict' -const { ServiceTester } = require('../tester') +const t = (module.exports = require('../tester').createServiceTester()) +const { isMetricOverTimePeriod } = require('../test-validators') -const t = (module.exports = new ServiceTester({ - id: 'JitpackDownloads', - title: 'JitpackDownloads', - pathPrefix: '/jitpack', -})) +t.create('weekly (github)') + .get('/dw/github/jitpack/maven-simple.json') + .timeout(10000) + .expectBadge({ label: 'downloads', message: isMetricOverTimePeriod }) -t.create('no longer available (was weekly github') - .get('/dw/github/erayerdin/kappdirs.json') +t.create('monthly (github)') + .get('/dm/github/dcendents/android-maven-gradle-plugin.json') + .timeout(10000) + .expectBadge({ label: 'downloads', message: isMetricOverTimePeriod }) + +t.create('unknown package (github)') + .get('/dw/github/some-bogus-user/super-fake-project.json') + .timeout(10000) .expectBadge({ label: 'downloads', - message: 'temporarily unavailable', - }) - -t.create('no longer available (was monthly github') - .get('/dm/github/erayerdin/kappdirs.json') - .expectBadge({ - label: 'downloads', - message: 'temporarily unavailable', + message: '0/week', })