diff --git a/services/pub/pub-points.service.js b/services/pub/pub-points.service.js new file mode 100644 index 0000000000000..0511e9149c2ab --- /dev/null +++ b/services/pub/pub-points.service.js @@ -0,0 +1,55 @@ +import Joi from 'joi' +import { floorCount } from '../color-formatters.js' +import { BaseJsonService } from '../index.js' +import { nonNegativeInteger } from '../validators.js' + +const documentation = `

A measure of quality. This includes several dimensions of quality such as code style, platform support, and maintainability.

` + +const keywords = ['dart', 'flutter'] + +const schema = Joi.object({ + grantedPoints: nonNegativeInteger, + maxPoints: nonNegativeInteger, +}).required() + +const title = 'Pub Points' + +export default class PubPoints extends BaseJsonService { + static category = 'rating' + + static route = { base: 'pub/points', pattern: ':packageName' } + + static examples = [ + { + title, + keywords, + documentation, + namedParams: { packageName: 'analysis_options' }, + staticPreview: this.render({ grantedPoints: 120, maxPoints: 130 }), + }, + ] + + static defaultBadgeData = { label: 'points' } + + static render({ grantedPoints, maxPoints }) { + return { + label: 'points', + message: `${grantedPoints}/${maxPoints}`, + color: floorCount((grantedPoints / maxPoints) * 100, 40, 60, 80), + } + } + + async fetch({ packageName }) { + return this._requestJson({ + schema, + url: `https://pub.dev/api/packages/${packageName}/score`, + }) + } + + async handle({ packageName }) { + const score = await this.fetch({ packageName }) + const grantedPoints = score.grantedPoints + const maxPoints = score.maxPoints + return this.constructor.render({ grantedPoints, maxPoints }) + } +} diff --git a/services/pub/pub-points.tester.js b/services/pub/pub-points.tester.js new file mode 100644 index 0000000000000..55a8b238de747 --- /dev/null +++ b/services/pub/pub-points.tester.js @@ -0,0 +1,23 @@ +import Joi from 'joi' +import { createServiceTester } from '../tester.js' + +export const t = await createServiceTester() + +t.create('pub points (valid)') + .get('/analysis_options.json') + .expectBadge({ + label: 'points', + message: Joi.string().regex(/^\d+\/130$/), + }) + +t.create('pub points (not found)').get('/analysisoptions.json').expectBadge({ + label: 'points', + message: 'not found', + color: 'red', +}) + +t.create('pub points (invalid)').get('/analysis-options.json').expectBadge({ + label: 'points', + message: 'invalid', + color: 'lightgrey', +})