Add MicroBadger (#1340)
This commit is contained in:
committed by
Paul Melnikow
parent
a087b28d06
commit
b1ca6391d0
@@ -1876,6 +1876,34 @@ const allBadgeExamples = [
|
||||
'imagelayers'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'MicroBadger Size',
|
||||
previewUri: '/microbadger/image-size/_/httpd.svg',
|
||||
keywords: [
|
||||
'docker'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'MicroBadger Size (tag)',
|
||||
previewUri: '/microbadger/image-size/_/httpd/alpine.svg',
|
||||
keywords: [
|
||||
'docker'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'MicroBadger Layers',
|
||||
previewUri: '/microbadger/layers/_/httpd.svg',
|
||||
keywords: [
|
||||
'docker'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'MicroBadger Layers (tag)',
|
||||
previewUri: '/microbadger/layers/_/httpd/alpine.svg',
|
||||
keywords: [
|
||||
'docker'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Gitter',
|
||||
previewUri: '/gitter/room/nwjs/nw.js.svg'
|
||||
|
||||
70
server.js
70
server.js
@@ -6528,6 +6528,76 @@ cache(function(data, match, sendBadge, request) {
|
||||
});
|
||||
}));
|
||||
|
||||
// MicroBadger integration.
|
||||
camp.route(/^\/microbadger\/(image-size|layers)\/([^/]+)\/([^/]+)\/?([^/]*)\.(svg|png|gif|jpg|json)$/,
|
||||
cache(function(data, match, sendBadge, request) {
|
||||
const type = match[1];
|
||||
let user = match[2];
|
||||
const repo = match[3];
|
||||
const tag = match[4];
|
||||
const format = match[5];
|
||||
if (user === '_') {
|
||||
user = 'library';
|
||||
}
|
||||
const url = `https://api.microbadger.com/v1/images/${user}/${repo}`;
|
||||
|
||||
let badgeData = getBadgeData(type, data);
|
||||
if (type === 'image-size') {
|
||||
badgeData.text[0] = getLabel('image size', data);
|
||||
}
|
||||
|
||||
const options = {
|
||||
method: 'GET',
|
||||
uri: url,
|
||||
headers: {
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
};
|
||||
request(options, function(err, res, buffer) {
|
||||
if (res && res.statusCode === 404) {
|
||||
badgeData.text[1] = 'not found';
|
||||
sendBadge(format, badgeData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (err != null || !res || res.statusCode !== 200) {
|
||||
badgeData.text[1] = 'inaccessible';
|
||||
sendBadge(format, badgeData);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const parsedData = JSON.parse(buffer);
|
||||
let image;
|
||||
|
||||
if (tag) {
|
||||
image = parsedData.Versions && parsedData.Versions.find(v => v.Tags.some(t => t.tag === tag));
|
||||
if (!image) {
|
||||
badgeData.text[1] = 'not found';
|
||||
sendBadge(format, badgeData);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
image = parsedData;
|
||||
}
|
||||
|
||||
if (type === 'image-size') {
|
||||
const size = prettyBytes(parseInt(image.DownloadSize));
|
||||
badgeData.text[1] = size;
|
||||
} else if (type === 'layers') {
|
||||
badgeData.text[1] = image.LayerCount;
|
||||
}
|
||||
badgeData.colorscheme = null;
|
||||
badgeData.colorB = '#007ec6';
|
||||
sendBadge(format, badgeData);
|
||||
} catch(e) {
|
||||
badgeData.colorscheme = 'red';
|
||||
badgeData.text[1] = 'error';
|
||||
sendBadge(format, badgeData);
|
||||
}
|
||||
});
|
||||
}));
|
||||
|
||||
// Gitter room integration.
|
||||
camp.route(/^\/gitter\/room\/([^/]+\/[^/]+)\.(svg|png|gif|jpg|json)$/,
|
||||
cache(function(data, match, sendBadge, request) {
|
||||
|
||||
77
service-tests/microbadger.js
Normal file
77
service-tests/microbadger.js
Normal file
@@ -0,0 +1,77 @@
|
||||
'use strict';
|
||||
|
||||
const Joi = require('joi');
|
||||
const ServiceTester = require('./runner/service-tester');
|
||||
const { isFileSize } = require('./helpers/validators')
|
||||
|
||||
const t = new ServiceTester({ id: 'microbadger', title: 'MicroBadger' })
|
||||
module.exports = t;
|
||||
|
||||
t.create('image size without a specified tag')
|
||||
.get('/image-size/_/hello-world.json')
|
||||
.expectJSONTypes(Joi.object().keys({
|
||||
name: 'image size',
|
||||
value: isFileSize
|
||||
}));
|
||||
|
||||
t.create('image size with a specified tag')
|
||||
.get('/image-size/_/httpd/alpine.json')
|
||||
.expectJSONTypes(Joi.object().keys({
|
||||
name: 'image size',
|
||||
value: isFileSize
|
||||
}));
|
||||
|
||||
t.create('layers without a specified tag')
|
||||
.get('/layers/_/hello-world.json')
|
||||
.expectJSONTypes(Joi.object().keys({
|
||||
name: 'layers',
|
||||
value: Joi.number().integer().positive()
|
||||
}));
|
||||
|
||||
t.create('layers with a specified tag')
|
||||
.get('/layers/_/httpd/alpine.json')
|
||||
.expectJSONTypes(Joi.object().keys({
|
||||
name: 'layers',
|
||||
value: Joi.number().integer().positive()
|
||||
}));
|
||||
|
||||
t.create('specified tag when repository has only one')
|
||||
.get('/layers/_/hello-world/wrong-tag.json')
|
||||
.expectJSON({ name: 'layers', value: 'not found' });
|
||||
|
||||
t.create('nonexistent repository')
|
||||
.get('/layers/_/unknown.json')
|
||||
.intercept(nock => nock('https://api.microbadger.com')
|
||||
.get('/v1/images/library/unknown')
|
||||
.reply(404)
|
||||
)
|
||||
.expectJSON({ name: 'layers', value: 'not found' });
|
||||
|
||||
t.create('nonexistent tag')
|
||||
.get('/layers/_/unknown/wrong-tag.json')
|
||||
.intercept(nock => nock('https://api.microbadger.com')
|
||||
.get('/v1/images/library/unknown')
|
||||
.reply(200, { Versions: [] })
|
||||
)
|
||||
.expectJSON({ name: 'layers', value: 'not found' });
|
||||
|
||||
t.create('server error')
|
||||
.get('/image-size/_/hello-world.json')
|
||||
.intercept(nock => nock('https://api.microbadger.com')
|
||||
.get('/v1/images/library/hello-world')
|
||||
.reply(500, 'Something went wrong')
|
||||
)
|
||||
.expectJSON({ name: 'image size', value: 'inaccessible' });
|
||||
|
||||
t.create('connection error')
|
||||
.get('/image-size/_/hello-world.json')
|
||||
.networkOff()
|
||||
.expectJSON({ name: 'image size', value: 'inaccessible' });
|
||||
|
||||
t.create('unexpected response')
|
||||
.get('/image-size/_/hello-world.json')
|
||||
.intercept(nock => nock('https://api.microbadger.com')
|
||||
.get('/v1/images/library/hello-world')
|
||||
.reply(200, "{{{{{invalid json}}")
|
||||
)
|
||||
.expectJSON({ name: 'image size', value: 'error' });
|
||||
Reference in New Issue
Block a user