From 41a508d9008eba2efc237d01a316e1fa79f7687e Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Nov 2017 00:09:32 -0600 Subject: [PATCH 01/24] Add receiving badge. --- lib/all-badge-examples.js | 4 ++++ server.js | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lib/all-badge-examples.js b/lib/all-badge-examples.js index bbaf93ac0198d..e55f86beaeb8a 100644 --- a/lib/all-badge-examples.js +++ b/lib/all-badge-examples.js @@ -1015,6 +1015,10 @@ const allBadgeExamples = [ title: 'Gratipay', previewUri: '/gratipay/project/shields.svg' }, + { + title: 'Liberapay', + previewUri: '/liberapay/Changaco.svg' + }, { title: 'Bountysource', previewUri: '/bountysource/team/mozilla-core/activity.svg' diff --git a/server.js b/server.js index 218b249ec35ed..28020f82a207d 100644 --- a/server.js +++ b/server.js @@ -1066,6 +1066,49 @@ cache(function(data, match, sendBadge, request) { }); })); +// Liberapay integration. +camp.route(/^\/liberapay\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var entity = match[1]; // eg, 'Changaco' + var format = match[2]; + var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; + var badgeData = getBadgeData('receives', data); + if (badgeData.template === 'social') { + badgeData.logo = getLogo('liberapay', data); + } + request(apiUrl, function dealWithData(err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + var data = JSON.parse(buffer); + // Avoid falsey checks because amounts may be 0 + var receiving = data.receiving.amount; + if (!isNaN(receiving)) { + badgeData.text[1] = '$' + metric(receiving) + '/week'; + if (receiving === 0) { + badgeData.colorscheme = 'red'; + } else if (receiving < 10) { + badgeData.colorscheme = 'yellow'; + } else if (receiving < 100) { + badgeData.colorscheme = 'green'; + } else { + badgeData.colorscheme = 'brightgreen'; + } + sendBadge(format, badgeData); + } else { + badgeData.text[1] = 'anonymous'; + sendBadge(format, badgeData); + } + } catch(e) { + badgeData.text[1] = apiUrl; + sendBadge(format, badgeData); + } + }); +})); + // Libscore integration. camp.route(/^\/libscore\/s\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { From b30329c41030253f43bef657370cb44ddb8fcc74 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Nov 2017 09:39:09 -0600 Subject: [PATCH 02/24] Fix invalid. --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 28020f82a207d..43da3332bfbd5 100644 --- a/server.js +++ b/server.js @@ -1103,7 +1103,7 @@ cache(function(data, match, sendBadge, request) { sendBadge(format, badgeData); } } catch(e) { - badgeData.text[1] = apiUrl; + badgeData.text[1] = 'invalid'; sendBadge(format, badgeData); } }); From eda1c324cce7d0ce883441eb8fa2bcab10bd085e Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Nov 2017 13:23:10 -0600 Subject: [PATCH 03/24] Stub out giving vs receiving. --- server.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 43da3332bfbd5..5268e72ebab91 100644 --- a/server.js +++ b/server.js @@ -1067,12 +1067,17 @@ cache(function(data, match, sendBadge, request) { })); // Liberapay integration. -camp.route(/^\/liberapay\/(.*)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/liberapay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var entity = match[1]; // eg, 'Changaco' - var format = match[2]; + var type = match[2] + var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; - var badgeData = getBadgeData('receives', data); + if (type == 'gives') { + var badgeData = getBadgeData('gives', data); + } else { + var badgeData = getBadgeData('receives', data); + } if (badgeData.template === 'social') { badgeData.logo = getLogo('liberapay', data); } From 6792bf01be34de17dbd1e9c0e4b75891abb2dfb1 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Nov 2017 13:27:33 -0600 Subject: [PATCH 04/24] Finish gives vs receives. --- server.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index 5268e72ebab91..9dbc20e4be303 100644 --- a/server.js +++ b/server.js @@ -1090,14 +1090,18 @@ cache(function(data, match, sendBadge, request) { try { var data = JSON.parse(buffer); // Avoid falsey checks because amounts may be 0 - var receiving = data.receiving.amount; - if (!isNaN(receiving)) { - badgeData.text[1] = '$' + metric(receiving) + '/week'; - if (receiving === 0) { + if (type == 'gives') { + var value = data.giving.amount; + } else { + var value = data.receiving.amount; + } + if (!isNaN(value)) { + badgeData.text[1] = '$' + metric(value) + '/week'; + if (value === 0) { badgeData.colorscheme = 'red'; - } else if (receiving < 10) { + } else if (value < 10) { badgeData.colorscheme = 'yellow'; - } else if (receiving < 100) { + } else if (value < 100) { badgeData.colorscheme = 'green'; } else { badgeData.colorscheme = 'brightgreen'; From b609b08ad167760cff8c12e03fd1b860b4013d1c Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 7 Nov 2017 13:31:43 -0600 Subject: [PATCH 05/24] Fix null check. --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 9dbc20e4be303..35af400ca61d9 100644 --- a/server.js +++ b/server.js @@ -1095,7 +1095,7 @@ cache(function(data, match, sendBadge, request) { } else { var value = data.receiving.amount; } - if (!isNaN(value)) { + if (value != null) { badgeData.text[1] = '$' + metric(value) + '/week'; if (value === 0) { badgeData.colorscheme = 'red'; From 7131f279465c5690cd0a389b993fae112bee3f4b Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 8 Nov 2017 00:00:36 -0600 Subject: [PATCH 06/24] Add more badges. --- lib/all-badge-examples.js | 16 ++++++++++++++-- server.js | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/all-badge-examples.js b/lib/all-badge-examples.js index e55f86beaeb8a..9adca1055adf4 100644 --- a/lib/all-badge-examples.js +++ b/lib/all-badge-examples.js @@ -1016,8 +1016,20 @@ const allBadgeExamples = [ previewUri: '/gratipay/project/shields.svg' }, { - title: 'Liberapay', - previewUri: '/liberapay/Changaco.svg' + title: 'Liberapay receiving', + previewUri: '/liberapay/Liberapay/receives.svg' + }, + { + title: 'Liberapay giving', + previewUri: '/liberapay/Changaco/gives.svg' + }, + { + title: 'Liberapay patrons', + previewUri: '/liberapay/Liberapay/patrons.svg' + }, + { + title: 'Liberapay goal progress', + previewUri: '/liberapay/Liberapay/goal.svg' }, { title: 'Bountysource', diff --git a/server.js b/server.js index 35af400ca61d9..98a229c23b32c 100644 --- a/server.js +++ b/server.js @@ -1078,6 +1078,19 @@ cache(function(data, match, sendBadge, request) { } else { var badgeData = getBadgeData('receives', data); } + switch(type) { + case 'gives': + var badgeData = getBadgeData('gives', data); + break; + case 'patrons': + var badgeData = getBadgeData('patrons', data); + break; + case 'goal': + var badgeData = getBadgeData('goal progress', data); + break; + default: + var badgeData = getBadgeData('receives', data); + } if (badgeData.template === 'social') { badgeData.logo = getLogo('liberapay', data); } @@ -1089,14 +1102,27 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); - // Avoid falsey checks because amounts may be 0 - if (type == 'gives') { - var value = data.giving.amount; - } else { - var value = data.receiving.amount; + switch(type) { + case 'gives': + var value = data.giving.amount; + var currency = data.giving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + break; + case 'patrons': + var value = data.npatrons; + badgeData.text[1] = metric(value); + break; + case 'goal': + var receiving = data.receiving.amount; + var value = Math.round(data.receiving.amount/data.goal.amount*100); + badgeData.text[1] = metric(value) + '%'; + break; + default: + var value = data.receiving.amount; + var currency = data.receiving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; } if (value != null) { - badgeData.text[1] = '$' + metric(value) + '/week'; if (value === 0) { badgeData.colorscheme = 'red'; } else if (value < 10) { From b549b84e39ece9d4dbb1bf1b11e0bf07f85d7bdd Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 8 Nov 2017 14:20:59 -0600 Subject: [PATCH 07/24] Simplify. --- server.js | 1 - 1 file changed, 1 deletion(-) diff --git a/server.js b/server.js index 98a229c23b32c..024375e6c5f67 100644 --- a/server.js +++ b/server.js @@ -1113,7 +1113,6 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = metric(value); break; case 'goal': - var receiving = data.receiving.amount; var value = Math.round(data.receiving.amount/data.goal.amount*100); badgeData.text[1] = metric(value) + '%'; break; From d61e174eb8a8ab461dbdd95266609201cb232b97 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 8 Nov 2017 15:17:54 -0600 Subject: [PATCH 08/24] Start tests. --- server.js | 7 +------ service-tests/liberapay.js | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 service-tests/liberapay.js diff --git a/server.js b/server.js index 024375e6c5f67..5b80b355a2438 100644 --- a/server.js +++ b/server.js @@ -1073,11 +1073,6 @@ cache(function(data, match, sendBadge, request) { var type = match[2] var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; - if (type == 'gives') { - var badgeData = getBadgeData('gives', data); - } else { - var badgeData = getBadgeData('receives', data); - } switch(type) { case 'gives': var badgeData = getBadgeData('gives', data); @@ -1106,7 +1101,7 @@ cache(function(data, match, sendBadge, request) { case 'gives': var value = data.giving.amount; var currency = data.giving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + badgeData.text[1] = metric(value) + ' ' + currency + '\/week'; break; case 'patrons': var value = data.npatrons; diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js new file mode 100644 index 0000000000000..a0a80cb7b423c --- /dev/null +++ b/service-tests/liberapay.js @@ -0,0 +1,22 @@ +'use strict'; + +const Joi = require('joi'); +const ServiceTester = require('./runner/service-tester'); + +const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); +module.exports = t; + +t.create('Receiving') + .get('/Liberapay/receives.json') + .expectJSONTypes(Joi.object().keys({ + name: 'receives', + value: Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/) + })); + +t.create('Empty') + .get('/Liberapay/receives.json') + .intercept(nock => nock('https://liberapay.com') + .get('/Liberapay/public.json') + .reply(200, { receiving: 0.00 }) + ) + .expectJSON({ name: 'receives', value: 'anonymous'}); From 7891d709288ae462caa44060fb703626aea9350c Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 8 Nov 2017 16:01:24 -0600 Subject: [PATCH 09/24] Fix minor issues. --- server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 5b80b355a2438..571df215d2a76 100644 --- a/server.js +++ b/server.js @@ -1070,7 +1070,7 @@ cache(function(data, match, sendBadge, request) { camp.route(/^\/liberapay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var entity = match[1]; // eg, 'Changaco' - var type = match[2] + var type = match[2]; var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; switch(type) { @@ -1101,7 +1101,7 @@ cache(function(data, match, sendBadge, request) { case 'gives': var value = data.giving.amount; var currency = data.giving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '\/week'; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; break; case 'patrons': var value = data.npatrons; From b0589c699fe84ea3f57092ac624304aa9245b6f2 Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 8 Nov 2017 16:07:32 -0600 Subject: [PATCH 10/24] Avoid redeclares. --- server.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/server.js b/server.js index 571df215d2a76..9b237487ee552 100644 --- a/server.js +++ b/server.js @@ -1073,18 +1073,18 @@ cache(function(data, match, sendBadge, request) { var type = match[2]; var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; + // Establish default + var badgeData = getBadgeData('receives', data); switch(type) { case 'gives': - var badgeData = getBadgeData('gives', data); + badgeData = getBadgeData('gives', data); break; case 'patrons': - var badgeData = getBadgeData('patrons', data); + badgeData = getBadgeData('patrons', data); break; case 'goal': - var badgeData = getBadgeData('goal progress', data); + badgeData = getBadgeData('goal progress', data); break; - default: - var badgeData = getBadgeData('receives', data); } if (badgeData.template === 'social') { badgeData.logo = getLogo('liberapay', data); @@ -1097,24 +1097,24 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); + // Establish defaults + var value = data.receiving.amount; + var currency = data.receiving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; switch(type) { case 'gives': - var value = data.giving.amount; - var currency = data.giving.currency; + value = data.giving.amount; + currency = data.giving.currency; badgeData.text[1] = metric(value) + ' ' + currency + '/week'; break; case 'patrons': - var value = data.npatrons; + value = data.npatrons; badgeData.text[1] = metric(value); break; case 'goal': - var value = Math.round(data.receiving.amount/data.goal.amount*100); + value = Math.round(data.receiving.amount/data.goal.amount*100); badgeData.text[1] = metric(value) + '%'; - break; - default: - var value = data.receiving.amount; - var currency = data.receiving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + break; } if (value != null) { if (value === 0) { From 923bb5e203e7914835548dd8048663c676ce27b7 Mon Sep 17 00:00:00 2001 From: mattbk Date: Wed, 8 Nov 2017 16:14:41 -0600 Subject: [PATCH 11/24] Rm trailing space. --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 9b237487ee552..9204989673d95 100644 --- a/server.js +++ b/server.js @@ -1114,7 +1114,7 @@ cache(function(data, match, sendBadge, request) { case 'goal': value = Math.round(data.receiving.amount/data.goal.amount*100); badgeData.text[1] = metric(value) + '%'; - break; + break; } if (value != null) { if (value === 0) { From 48b8daebc3a98d15501864f87ec84cef12f9c640 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 8 Nov 2017 17:30:03 -0600 Subject: [PATCH 12/24] Add more tests. --- service-tests/liberapay.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index a0a80cb7b423c..a86a0b0ec5ad2 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -13,6 +13,35 @@ t.create('Receiving') value: Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/) })); +t.create('Giving') + .get('/Liberapay/gives.json') + .expectJSONTypes(Joi.object().keys({ + name: 'gives', + value: Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/) + })); + +t.create('Patrons') + .get('/Liberapay/patrons.json') + .expectJSONTypes(Joi.object().keys({ + name: 'patrons', + value: Joi.string().regex(/^[0-9]+/) + })); + +t.create('Goal Progress') + .get('/Liberapay/goal.json') + .expectJSONTypes(Joi.object().keys({ + name: 'goal progress', + value: Joi.string().regex(/^[0-9]+\%/) + })); + +t.create('No Goal') + .get('/Liberapay/goal.json') + .intercept(nock => nock('https://liberapay.com') + .get('/Liberapay/public.json') + .reply(200, { goal: null }) + ) + .expectJSON({ name: 'goal progress', value: 'invalid'}); + t.create('Empty') .get('/Liberapay/receives.json') .intercept(nock => nock('https://liberapay.com') From e3df8529fa24c1975153cdd288eac4bd0767fd0f Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 8 Nov 2017 23:53:10 -0600 Subject: [PATCH 13/24] Shelve. --- server.js | 11 +++++++---- service-tests/liberapay.js | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index 9204989673d95..52cf5bf724861 100644 --- a/server.js +++ b/server.js @@ -1097,11 +1097,14 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); - // Establish defaults - var value = data.receiving.amount; - var currency = data.receiving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + var value; + var currency; switch(type) { + case 'receives': + value = data.receiving.amount; + currency = data.receiving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + break; case 'gives': value = data.giving.amount; currency = data.giving.currency; diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index a86a0b0ec5ad2..35e2109fe444d 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -31,7 +31,7 @@ t.create('Goal Progress') .get('/Liberapay/goal.json') .expectJSONTypes(Joi.object().keys({ name: 'goal progress', - value: Joi.string().regex(/^[0-9]+\%/) + value: Joi.string().regex(/^[0-9]+%/) })); t.create('No Goal') From 850457b2f4d3ff898e0f971919a733094de84ce4 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 9 Nov 2017 00:26:20 -0600 Subject: [PATCH 14/24] Deal with anonymous values. --- server.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index 52cf5bf724861..9ed7653aa83e7 100644 --- a/server.js +++ b/server.js @@ -1101,22 +1101,28 @@ cache(function(data, match, sendBadge, request) { var currency; switch(type) { case 'receives': - value = data.receiving.amount; - currency = data.receiving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + if (data.receiving) { + value = data.receiving.amount; + currency = data.receiving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + } break; case 'gives': - value = data.giving.amount; - currency = data.giving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + if (data.giving) { + value = data.giving.amount; + currency = data.giving.currency; + badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + } break; case 'patrons': value = data.npatrons; badgeData.text[1] = metric(value); break; case 'goal': - value = Math.round(data.receiving.amount/data.goal.amount*100); - badgeData.text[1] = metric(value) + '%'; + if (data.goal) { + value = Math.round(data.receiving.amount/data.goal.amount*100); + badgeData.text[1] = metric(value) + '%'; + } break; } if (value != null) { @@ -1132,6 +1138,7 @@ cache(function(data, match, sendBadge, request) { sendBadge(format, badgeData); } else { badgeData.text[1] = 'anonymous'; + badgeData.colorscheme = 'blue'; sendBadge(format, badgeData); } } catch(e) { From 8cd7e0497c329da747b7fd695a1a3d51d35a44b0 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 9 Nov 2017 00:28:13 -0600 Subject: [PATCH 15/24] Fix no goal/anonymous test. --- service-tests/liberapay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index 35e2109fe444d..10ed325c303eb 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -40,7 +40,7 @@ t.create('No Goal') .get('/Liberapay/public.json') .reply(200, { goal: null }) ) - .expectJSON({ name: 'goal progress', value: 'invalid'}); + .expectJSON({ name: 'goal progress', value: 'anonymous'}); t.create('Empty') .get('/Liberapay/receives.json') From d606cfa01a561a3eb09782d7fc39dfbb72e8092e Mon Sep 17 00:00:00 2001 From: mattbk Date: Thu, 9 Nov 2017 12:24:12 -0600 Subject: [PATCH 16/24] Add colorScale. --- server.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/server.js b/server.js index 9ed7653aa83e7..5dd8f15d08b13 100644 --- a/server.js +++ b/server.js @@ -1126,15 +1126,8 @@ cache(function(data, match, sendBadge, request) { break; } if (value != null) { - if (value === 0) { - badgeData.colorscheme = 'red'; - } else if (value < 10) { - badgeData.colorscheme = 'yellow'; - } else if (value < 100) { - badgeData.colorscheme = 'green'; - } else { - badgeData.colorscheme = 'brightgreen'; - } + const {colorScale} = require('./lib/color-formatters'); + badgeData.colorscheme = colorScale([0, 10, 100])(value); sendBadge(format, badgeData); } else { badgeData.text[1] = 'anonymous'; From 0bbceb99659321449ae6dae1c3dbbf41a0555c86 Mon Sep 17 00:00:00 2001 From: mattbk Date: Thu, 9 Nov 2017 17:12:37 -0600 Subject: [PATCH 17/24] Make suggested changes. --- lib/all-badge-examples.js | 8 ++++---- server.js | 14 +++++++------- service-tests/liberapay.js | 7 ++++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/all-badge-examples.js b/lib/all-badge-examples.js index 9adca1055adf4..f396243147901 100644 --- a/lib/all-badge-examples.js +++ b/lib/all-badge-examples.js @@ -1017,19 +1017,19 @@ const allBadgeExamples = [ }, { title: 'Liberapay receiving', - previewUri: '/liberapay/Liberapay/receives.svg' + previewUri: '/liberapay/receives/Changaco.svg' }, { title: 'Liberapay giving', - previewUri: '/liberapay/Changaco/gives.svg' + previewUri: '/liberapay/gives/Changaco.svg' }, { title: 'Liberapay patrons', - previewUri: '/liberapay/Liberapay/patrons.svg' + previewUri: '/liberapay/patrons/Changaco.svg' }, { title: 'Liberapay goal progress', - previewUri: '/liberapay/Liberapay/goal.svg' + previewUri: '/liberapay/goal/Changaco.svg' }, { title: 'Bountysource', diff --git a/server.js b/server.js index 5dd8f15d08b13..8fa3c4d8900df 100644 --- a/server.js +++ b/server.js @@ -39,7 +39,8 @@ const { downloadCount: downloadCountColor, floorCount: floorCountColor, version: versionColor, - age: ageColor + age: ageColor, + colorScale } = require('./lib/color-formatters'); const { makeColorB, @@ -1069,8 +1070,8 @@ cache(function(data, match, sendBadge, request) { // Liberapay integration. camp.route(/^\/liberapay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var entity = match[1]; // eg, 'Changaco' - var type = match[2]; + var type = match[1]; // e.g., 'gives' + var entity = match[2]; // e.g., 'Changaco' var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; // Establish default @@ -1104,14 +1105,14 @@ cache(function(data, match, sendBadge, request) { if (data.receiving) { value = data.receiving.amount; currency = data.receiving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + badgeData.text[1] = `${metric(value)} ${currency}/week`; } break; case 'gives': if (data.giving) { value = data.giving.amount; currency = data.giving.currency; - badgeData.text[1] = metric(value) + ' ' + currency + '/week'; + badgeData.text[1] = `${metric(value)} ${currency}/week`; } break; case 'patrons': @@ -1121,12 +1122,11 @@ cache(function(data, match, sendBadge, request) { case 'goal': if (data.goal) { value = Math.round(data.receiving.amount/data.goal.amount*100); - badgeData.text[1] = metric(value) + '%'; + badgeData.text[1] = `${value}%`; } break; } if (value != null) { - const {colorScale} = require('./lib/color-formatters'); badgeData.colorscheme = colorScale([0, 10, 100])(value); sendBadge(format, badgeData); } else { diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index 10ed325c303eb..9317f1793dcd5 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -2,7 +2,8 @@ const Joi = require('joi'); const ServiceTester = require('./runner/service-tester'); - +const isLiberapayTestValues = + Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/); const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; @@ -10,14 +11,14 @@ t.create('Receiving') .get('/Liberapay/receives.json') .expectJSONTypes(Joi.object().keys({ name: 'receives', - value: Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/) + value: isLiberapayTestValues })); t.create('Giving') .get('/Liberapay/gives.json') .expectJSONTypes(Joi.object().keys({ name: 'gives', - value: Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/) + value: isLiberapayTestValues })); t.create('Patrons') From 09713a8d330160354b56bfc92fc7e2fcbc260bcf Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 9 Nov 2017 22:50:58 -0600 Subject: [PATCH 18/24] Fix tests. --- service-tests/liberapay.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index 9317f1793dcd5..230d0646dda3f 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -8,35 +8,35 @@ const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; t.create('Receiving') - .get('/Liberapay/receives.json') + .get('/receives/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'receives', value: isLiberapayTestValues })); t.create('Giving') - .get('/Liberapay/gives.json') + .get('/gives/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'gives', value: isLiberapayTestValues })); t.create('Patrons') - .get('/Liberapay/patrons.json') + .get('/patrons/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'patrons', value: Joi.string().regex(/^[0-9]+/) })); t.create('Goal Progress') - .get('/Liberapay/goal.json') + .get('/goal/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'goal progress', value: Joi.string().regex(/^[0-9]+%/) })); t.create('No Goal') - .get('/Liberapay/goal.json') + .get('/goal/Liberapay.json') .intercept(nock => nock('https://liberapay.com') .get('/Liberapay/public.json') .reply(200, { goal: null }) @@ -44,7 +44,7 @@ t.create('No Goal') .expectJSON({ name: 'goal progress', value: 'anonymous'}); t.create('Empty') - .get('/Liberapay/receives.json') + .get('/receives/Liberapay.json') .intercept(nock => nock('https://liberapay.com') .get('/Liberapay/public.json') .reply(200, { receiving: 0.00 }) From 4faadc33bafe97f80480061c74df28cf170b7a30 Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 20 Nov 2017 13:34:34 -0600 Subject: [PATCH 19/24] Suggestions, but regex is wrong for values less than 1.00. --- service-tests/liberapay.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index 230d0646dda3f..53fb08e07d072 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -3,7 +3,7 @@ const Joi = require('joi'); const ServiceTester = require('./runner/service-tester'); const isLiberapayTestValues = - Joi.string().regex(/^[0-9]+(\.[0-9]{2})?[ A-Za-z]{4}\/week/); + Joi.string().regex(/^[0-9]*[1-9][0-9]*(\.[0-9]{2})?[ A-Za-z]{4}\/week/); //values must be greater than zero const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; @@ -15,7 +15,7 @@ t.create('Receiving') })); t.create('Giving') - .get('/gives/Liberapay.json') + .get('/gives/Changaco.json') .expectJSONTypes(Joi.object().keys({ name: 'gives', value: isLiberapayTestValues @@ -25,7 +25,7 @@ t.create('Patrons') .get('/patrons/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'patrons', - value: Joi.string().regex(/^[0-9]+/) + value: Joi.string().regex(/^[1-9]+/) })); t.create('Goal Progress') From 98ef2f2367ede2772ffe3ba87252dc39a05cb5d0 Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 20 Nov 2017 13:39:48 -0600 Subject: [PATCH 20/24] Fixed regex. Two tests will fail. --- service-tests/liberapay.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index 53fb08e07d072..d917d3e22d6c2 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -3,12 +3,12 @@ const Joi = require('joi'); const ServiceTester = require('./runner/service-tester'); const isLiberapayTestValues = - Joi.string().regex(/^[0-9]*[1-9][0-9]*(\.[0-9]{2})?[ A-Za-z]{4}\/week/); //values must be greater than zero + Joi.string().regex(/^([0-9]*[1-9][0-9]*(\.[0-9]+)?|[0]+\.[0-9]*[1-9][0-9]*)[ A-Za-z]{4}\/week/); //values must be greater than zero const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; t.create('Receiving') - .get('/receives/Liberapay.json') + .get('/receives/mattbk.json') .expectJSONTypes(Joi.object().keys({ name: 'receives', value: isLiberapayTestValues @@ -22,7 +22,7 @@ t.create('Giving') })); t.create('Patrons') - .get('/patrons/Liberapay.json') + .get('/patrons/mattbk.json') .expectJSONTypes(Joi.object().keys({ name: 'patrons', value: Joi.string().regex(/^[1-9]+/) From 9d3f86f94fa7992fd27e17e3c2d6bb9638918569 Mon Sep 17 00:00:00 2001 From: mattbk Date: Mon, 20 Nov 2017 13:42:27 -0600 Subject: [PATCH 21/24] Fix tests. --- service-tests/liberapay.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index d917d3e22d6c2..e7330eb9c11a8 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -8,7 +8,7 @@ const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; t.create('Receiving') - .get('/receives/mattbk.json') + .get('/receives/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'receives', value: isLiberapayTestValues @@ -22,7 +22,7 @@ t.create('Giving') })); t.create('Patrons') - .get('/patrons/mattbk.json') + .get('/patrons/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'patrons', value: Joi.string().regex(/^[1-9]+/) From 47803f78bd7e915c40583739e9474cd964981876 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 30 Nov 2017 22:23:44 -0600 Subject: [PATCH 22/24] Replace case statement. --- server.js | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/server.js b/server.js index be9890b07605b..abac9cc10f277 100644 --- a/server.js +++ b/server.js @@ -1080,19 +1080,14 @@ cache(function(data, match, sendBadge, request) { var entity = match[2]; // e.g., 'Changaco' var format = match[3]; var apiUrl = 'https://liberapay.com/' + entity + '/public.json'; - // Establish default - var badgeData = getBadgeData('receives', data); - switch(type) { - case 'gives': - badgeData = getBadgeData('gives', data); - break; - case 'patrons': - badgeData = getBadgeData('patrons', data); - break; - case 'goal': - badgeData = getBadgeData('goal progress', data); - break; - } + // Lock down type + const label = { + 'receives': 'receives', + 'gives': 'gives', + 'patrons': 'patrons', + 'goal': 'goal progress', + }[type]; + const badgeData = getBadgeData(label, data); if (badgeData.template === 'social') { badgeData.logo = getLogo('liberapay', data); } From 66fc147d560ff31a1abd39c7753c1b089559bc5b Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 30 Nov 2017 22:34:37 -0600 Subject: [PATCH 23/24] Use isMetric for npatrons. --- service-tests/liberapay.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/service-tests/liberapay.js b/service-tests/liberapay.js index e7330eb9c11a8..9ba3a210ae2c4 100644 --- a/service-tests/liberapay.js +++ b/service-tests/liberapay.js @@ -4,6 +4,7 @@ const Joi = require('joi'); const ServiceTester = require('./runner/service-tester'); const isLiberapayTestValues = Joi.string().regex(/^([0-9]*[1-9][0-9]*(\.[0-9]+)?|[0]+\.[0-9]*[1-9][0-9]*)[ A-Za-z]{4}\/week/); //values must be greater than zero +const {isMetric} = require('./helpers/validators'); const t = new ServiceTester({ id: 'liberapay', title: 'Liberapay' }); module.exports = t; @@ -25,7 +26,7 @@ t.create('Patrons') .get('/patrons/Liberapay.json') .expectJSONTypes(Joi.object().keys({ name: 'patrons', - value: Joi.string().regex(/^[1-9]+/) + value: isMetric })); t.create('Goal Progress') From f0a84f758fb34676b7ebd70898f28dbcbb8abadb Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 5 Dec 2017 21:22:48 -0600 Subject: [PATCH 24/24] Limit regex. --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index abac9cc10f277..07febd6e22364 100644 --- a/server.js +++ b/server.js @@ -1074,7 +1074,7 @@ cache(function(data, match, sendBadge, request) { })); // Liberapay integration. -camp.route(/^\/liberapay\/(.*)\/(.*)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/liberapay\/(receives|gives|patrons|goal)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var type = match[1]; // e.g., 'gives' var entity = match[2]; // e.g., 'Changaco'