diff --git a/services/pub/pub-likes.service.js b/services/pub/pub-likes.service.js new file mode 100644 index 0000000000000000000000000000000000000000..8f066ded58e789eae27595e94670e0015795975e --- /dev/null +++ b/services/pub/pub-likes.service.js @@ -0,0 +1,53 @@ +import Joi from 'joi' +import { BaseJsonService } from '../index.js' +import { metric } from '../text-formatters.js' +import { nonNegativeInteger } from '../validators.js' + +const documentation = `<p>A measure of how many developers have liked a package. This provides a raw measure of the overall sentiment of a package from peer developers.</p>` + +const keywords = ['dart', 'flutter'] + +const schema = Joi.object({ + likeCount: nonNegativeInteger, +}).required() + +const title = 'Pub Likes' + +export default class PubLikes extends BaseJsonService { + static category = 'rating' + + static route = { base: 'pub/likes', pattern: ':packageName' } + + static examples = [ + { + title, + keywords, + documentation, + namedParams: { packageName: 'analysis_options' }, + staticPreview: this.render({ likeCount: 1000 }), + }, + ] + + static defaultBadgeData = { label: 'likes' } + + static render({ likeCount }) { + return { + label: 'likes', + message: metric(likeCount), + color: 'blue', + } + } + + 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 likeCount = score.likeCount + return this.constructor.render({ likeCount }) + } +} diff --git a/services/pub/pub-likes.tester.js b/services/pub/pub-likes.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..9c16f84a2ef5ea8b75cf6819be57b5bb57fefecd --- /dev/null +++ b/services/pub/pub-likes.tester.js @@ -0,0 +1,22 @@ +import { isMetric } from '../test-validators.js' +import { createServiceTester } from '../tester.js' + +export const t = await createServiceTester() + +t.create('pub likes (valid)').get('/analysis_options.json').expectBadge({ + label: 'likes', + message: isMetric, + color: 'blue', +}) + +t.create('pub likes (not found)').get('/analysisoptions.json').expectBadge({ + label: 'likes', + message: 'not found', + color: 'red', +}) + +t.create('pub likes (invalid)').get('/analysis-options.json').expectBadge({ + label: 'likes', + message: 'invalid', + color: 'lightgrey', +})