From 00ca9574429525b4d54138cbeb6240f6e2d4fdec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 24 Feb 2015 12:15:52 +0100 Subject: [PATCH 01/11] Use Puppetforge API v3 --- server.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index 0d48d2c..6e1ba0b 100644 --- a/server.js +++ b/server.js @@ -2241,13 +2241,14 @@ mapNugetFeed('myget\\/(.*)', 1, function(match) { }); // Puppet Forge -camp.route(/^\/puppetforge\/v\/([^\/]+\/[^\/]+)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/puppetforge\/v\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var userRepo = match[1]; - var format = match[2]; + var user = match[1]; + var module = match[2]; + var format = match[3]; var options = { json: true, - uri: 'https://forge.puppetlabs.com/api/v1/releases.json?module=' + userRepo + uri: 'https://forgeapi.puppetlabs.com/v3/modules/'+user+'-'+module }; var badgeData = getBadgeData('puppetforge', data); request(options, function dealWithData(err, res, json) { @@ -2260,7 +2261,7 @@ cache(function(data, match, sendBadge, request) { var unstable = function(ver) { return /-[0-9A-Za-z.-]+(?:\+[0-9A-Za-z.-]+)?$/.test(ver); }; - var releases = json[userRepo]; + var releases = json['releases']; if (releases.length == 0) { badgeData.text[1] = 'none'; badgeData.colorscheme = 'lightgrey'; From 51d959f4b74f6088e55bb912147fe332eaf7b0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 24 Feb 2015 12:31:05 +0100 Subject: [PATCH 02/11] Add more info flags for Puppetforge badges --- server.js | 86 ++++++++++++++++++++++++++++++++++++++++--------------- try.html | 12 ++++++++ 2 files changed, 75 insertions(+), 23 deletions(-) diff --git a/server.js b/server.js index 6e1ba0b..82637e8 100644 --- a/server.js +++ b/server.js @@ -2241,11 +2241,12 @@ mapNugetFeed('myget\\/(.*)', 1, function(match) { }); // Puppet Forge -camp.route(/^\/puppetforge\/v\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/puppetforge\/([^\/]+)\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var user = match[1]; - var module = match[2]; - var format = match[3]; + var info = match[1]; // either `v`, `dt`, `e` or `f` + var user = match[2]; + var module = match[3]; + var format = match[4]; var options = { json: true, uri: 'https://forgeapi.puppetlabs.com/v3/modules/'+user+'-'+module @@ -2258,26 +2259,65 @@ cache(function(data, match, sendBadge, request) { return; } try { - var unstable = function(ver) { - return /-[0-9A-Za-z.-]+(?:\+[0-9A-Za-z.-]+)?$/.test(ver); - }; - var releases = json['releases']; - if (releases.length == 0) { - badgeData.text[1] = 'none'; - badgeData.colorscheme = 'lightgrey'; - sendBadge(format, badgeData); - return; + if (info == 'v') { + var unstable = function(ver) { + return /-[0-9A-Za-z.-]+(?:\+[0-9A-Za-z.-]+)?$/.test(ver); + }; + var releases = json['releases']; + if (releases.length == 0) { + badgeData.text[1] = 'none'; + badgeData.colorscheme = 'lightgrey'; + sendBadge(format, badgeData); + return; + } + var versions = releases.map(function(version) { + return version.version; + }); + var version = latestVersion(versions); + if (unstable(version)) { + badgeData.colorscheme = "yellow"; + } else { + badgeData.colorscheme = "blue"; + } + badgeData.text[1] = "v" + version; + } else if (info == 'dt') { + var total = json['downloads']; + if (total === 0) { + badgeData.colorscheme = 'red'; + } else if (total < 100) { + badgeData.colorscheme = 'yellow'; + } else if (total < 1000) { + badgeData.colorscheme = 'yellowgreen'; + } else if (total < 10000) { + badgeData.colorscheme = 'green'; + } else { + badgeData.colorscheme = 'brightgreen'; + } + badgeData.text[1] = metric(total) + ' total'; + } else if (info == 'e') { + var endorsement = json['endorsement']; + if (endorsement == 'approved') { + badgeData.colorscheme = 'green'; + } else if (endorsement == 'supported') { + badgeData.colorscheme = 'brightgreen'; + } else { + badgeData.colorscheme = 'red'; + } + if (endorsement != null) { + badgeData.text[1] = endorsement; + } else { + badgeData.text[1] = 'no endorsement'; + } + } else if (info == 'f') { + var feedback = json['feedback_score']; + if (feedback != null) { + badgeData.text[1] = feedback+'%'; + badgeData.colorscheme = coveragePercentageColor(feedback); + } else { + badgeData.text[1] = 'unknown'; + badgeData.colorscheme = 'lightgrey'; + } } - var versions = releases.map(function(version) { - return version.version; - }); - var version = latestVersion(versions); - if (unstable(version)) { - badgeData.colorscheme = "yellow"; - } else { - badgeData.colorscheme = "blue"; - } - badgeData.text[1] = "v" + version; sendBadge(format, badgeData); } catch(e) { diff --git a/try.html b/try.html index 5591f28..9a22a0b 100644 --- a/try.html +++ b/try.html @@ -267,6 +267,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/apm/dm/vim-mode.svg + Puppet Forge: + + https://img.shields.io/puppetforge/dt/camptocamp/openldap.svg +

Version

@@ -486,6 +490,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable + + + + + + + +
https://img.shields.io/talk/t/9c81ff703b.svg
Puppet Forge: https://img.shields.io/puppetforge/e/camptocamp/openssl.svg
Puppet Forge: https://img.shields.io/puppetforge/f/camptocamp/openssl.svg

Your Badge

From 5b072303f68b4665e0a6737f187c38f4701087e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 24 Feb 2015 13:36:52 +0100 Subject: [PATCH 03/11] Add Puppet Forge user stats --- server.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- try.html | 8 ++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 82637e8..6f54147 100644 --- a/server.js +++ b/server.js @@ -2240,7 +2240,7 @@ mapNugetFeed('myget\\/(.*)', 1, function(match) { }; }); -// Puppet Forge +// Puppet Forge modules camp.route(/^\/puppetforge\/([^\/]+)\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var info = match[1]; // either `v`, `dt`, `e` or `f` @@ -2327,6 +2327,62 @@ cache(function(data, match, sendBadge, request) { }); })); +// Puppet Forge users +camp.route(/^\/puppetforge\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var info = match[1]; // either `rc` or `mc` + var user = match[2]; + var format = match[3]; + var options = { + json: true, + uri: 'https://forgeapi.puppetlabs.com/v3/users/'+user + }; + var badgeData = getBadgeData('puppetforge', data); + request(options, function dealWithData(err, res, json) { + if (err != null || (json.length !== undefined && json.length === 0)) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + if (info == 'rc') { + var releases = json['release_count']; + if (releases === 0) { + badgeData.colorscheme = 'red'; + } else if (releases < 10) { + badgeData.colorscheme = 'yellow'; + } else if (releases < 50) { + badgeData.colorscheme = 'yellowgreen'; + } else if (releases < 100) { + badgeData.colorscheme = 'green'; + } else { + badgeData.colorscheme = 'brightgreen'; + } + badgeData.text[1] = metric(releases) + ' releases'; + } else if (info == 'mc') { + var modules = json['module_count']; + if (modules === 0) { + badgeData.colorscheme = 'red'; + } else if (modules < 5) { + badgeData.colorscheme = 'yellow'; + } else if (modules < 10) { + badgeData.colorscheme = 'yellowgreen'; + } else if (modules < 50) { + badgeData.colorscheme = 'green'; + } else { + badgeData.colorscheme = 'brightgreen'; + } + badgeData.text[1] = metric(modules) + ' modules'; + } + sendBadge(format, badgeData); + + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // Jenkins build status integration camp.route(/^\/jenkins(-ci)?\/s\/(http(s)?)\/((?:[^\/]+)(?:\/.+?)?)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { diff --git a/try.html b/try.html index 9a22a0b..a64d0c0 100644 --- a/try.html +++ b/try.html @@ -498,6 +498,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/puppetforge/f/camptocamp/openssl.svg + Puppet Forge: + + https://img.shields.io/puppetforge/rc/camptocamp.svg + + Puppet Forge: + + https://img.shields.io/puppetforge/mc/camptocamp.svg +

Your Badge

From 0704d7ddfa4d5ad169ac93a7beb48ba7c6b9feda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:19:01 +0100 Subject: [PATCH 04/11] puppetforge: use versionColor() to simplify code --- server.js | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/server.js b/server.js index 6f54147..d67dc79 100644 --- a/server.js +++ b/server.js @@ -2260,26 +2260,15 @@ cache(function(data, match, sendBadge, request) { } try { if (info == 'v') { - var unstable = function(ver) { - return /-[0-9A-Za-z.-]+(?:\+[0-9A-Za-z.-]+)?$/.test(ver); - }; - var releases = json['releases']; - if (releases.length == 0) { + if (json['current_release']) { + var vdata = versionColor(json['current_release'].version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + } else { badgeData.text[1] = 'none'; badgeData.colorscheme = 'lightgrey'; - sendBadge(format, badgeData); - return; } - var versions = releases.map(function(version) { - return version.version; - }); - var version = latestVersion(versions); - if (unstable(version)) { - badgeData.colorscheme = "yellow"; - } else { - badgeData.colorscheme = "blue"; - } - badgeData.text[1] = "v" + version; + sendBadge(format, badgeData); } else if (info == 'dt') { var total = json['downloads']; if (total === 0) { From 3ca91e67fde54d7c87dec193d942af71cac8ec76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:24:00 +0100 Subject: [PATCH 05/11] puppetforge: use downloadCountColor() --- server.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/server.js b/server.js index d67dc79..c17883a 100644 --- a/server.js +++ b/server.js @@ -2271,17 +2271,7 @@ cache(function(data, match, sendBadge, request) { sendBadge(format, badgeData); } else if (info == 'dt') { var total = json['downloads']; - if (total === 0) { - badgeData.colorscheme = 'red'; - } else if (total < 100) { - badgeData.colorscheme = 'yellow'; - } else if (total < 1000) { - badgeData.colorscheme = 'yellowgreen'; - } else if (total < 10000) { - badgeData.colorscheme = 'green'; - } else { - badgeData.colorscheme = 'brightgreen'; - } + badgeData.colorscheme = downloadCountColor(total); badgeData.text[1] = metric(total) + ' total'; } else if (info == 'e') { var endorsement = json['endorsement']; From 8aa2ce172d132c9672d82b8978db7e351827e43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:25:02 +0100 Subject: [PATCH 06/11] Use json.x instead of json['x'] --- server.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server.js b/server.js index c17883a..0974b1b 100644 --- a/server.js +++ b/server.js @@ -2260,8 +2260,8 @@ cache(function(data, match, sendBadge, request) { } try { if (info == 'v') { - if (json['current_release']) { - var vdata = versionColor(json['current_release'].version); + if (json.current_release) { + var vdata = versionColor(json.current_release.version); badgeData.text[1] = vdata.version; badgeData.colorscheme = vdata.color; } else { @@ -2270,11 +2270,11 @@ cache(function(data, match, sendBadge, request) { } sendBadge(format, badgeData); } else if (info == 'dt') { - var total = json['downloads']; + var total = json.downloads; badgeData.colorscheme = downloadCountColor(total); badgeData.text[1] = metric(total) + ' total'; } else if (info == 'e') { - var endorsement = json['endorsement']; + var endorsement = json.endorsement; if (endorsement == 'approved') { badgeData.colorscheme = 'green'; } else if (endorsement == 'supported') { @@ -2288,7 +2288,7 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = 'no endorsement'; } } else if (info == 'f') { - var feedback = json['feedback_score']; + var feedback = json.feedback_score; if (feedback != null) { badgeData.text[1] = feedback+'%'; badgeData.colorscheme = coveragePercentageColor(feedback); @@ -2325,7 +2325,7 @@ cache(function(data, match, sendBadge, request) { } try { if (info == 'rc') { - var releases = json['release_count']; + var releases = json.release_count; if (releases === 0) { badgeData.colorscheme = 'red'; } else if (releases < 10) { @@ -2339,7 +2339,7 @@ cache(function(data, match, sendBadge, request) { } badgeData.text[1] = metric(releases) + ' releases'; } else if (info == 'mc') { - var modules = json['module_count']; + var modules = json.module_count; if (modules === 0) { badgeData.colorscheme = 'red'; } else if (modules < 5) { From e35f12fed2dad9882d402fb01458f76f7a936bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:35:29 +0100 Subject: [PATCH 07/11] Add a generic floorCountColor() function --- server.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/server.js b/server.js index 0974b1b..5b44cd1 100644 --- a/server.js +++ b/server.js @@ -3210,25 +3210,21 @@ function fetchFromSvg(request, url, cb) { } function coveragePercentageColor(percentage) { - if (percentage < 80) { - return 'yellow'; - } else if (percentage < 90) { - return 'yellowgreen'; - } else if (percentage < 100) { - return 'green'; - } else { - return 'brightgreen'; - } + floorCountColor(percentage, 80, 90, 100); } function downloadCountColor(downloads) { - if (downloads === 0) { + floorCountColor(downloads, 10, 100, 1000); +} + +function floorCountColor(value, yellow, yellowgreen, green) { + if (value === 0) { return 'red'; - } else if (downloads < 10) { + } else if (value < yellow) { return 'yellow'; - } else if (downloads < 100) { + } else if (value < yellowgreen) { return 'yellowgreen'; - } else if (downloads < 1000) { + } else if (value < green) { return 'green'; } else { return 'brightgreen'; From 87fda1fda6a7d5728aa7647b85ed86f01c3273fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:38:12 +0100 Subject: [PATCH 08/11] puppetforge: use floorCountColor() --- server.js | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/server.js b/server.js index 5b44cd1..d7e07f0 100644 --- a/server.js +++ b/server.js @@ -2326,31 +2326,11 @@ cache(function(data, match, sendBadge, request) { try { if (info == 'rc') { var releases = json.release_count; - if (releases === 0) { - badgeData.colorscheme = 'red'; - } else if (releases < 10) { - badgeData.colorscheme = 'yellow'; - } else if (releases < 50) { - badgeData.colorscheme = 'yellowgreen'; - } else if (releases < 100) { - badgeData.colorscheme = 'green'; - } else { - badgeData.colorscheme = 'brightgreen'; - } + badgeData.colorscheme = floorCountColor(releases, 10, 50, 100); badgeData.text[1] = metric(releases) + ' releases'; } else if (info == 'mc') { var modules = json.module_count; - if (modules === 0) { - badgeData.colorscheme = 'red'; - } else if (modules < 5) { - badgeData.colorscheme = 'yellow'; - } else if (modules < 10) { - badgeData.colorscheme = 'yellowgreen'; - } else if (modules < 50) { - badgeData.colorscheme = 'green'; - } else { - badgeData.colorscheme = 'brightgreen'; - } + badgeData.colorscheme = floorCountColor(modules, 5, 10, 50); badgeData.text[1] = metric(modules) + ' modules'; } sendBadge(format, badgeData); From 490664ff3bab06e047053f19d26d700e3bfd62bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:42:58 +0100 Subject: [PATCH 09/11] puppetforge: Adjust badge labels --- server.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index d7e07f0..0b6666f 100644 --- a/server.js +++ b/server.js @@ -2272,6 +2272,7 @@ cache(function(data, match, sendBadge, request) { } else if (info == 'dt') { var total = json.downloads; badgeData.colorscheme = downloadCountColor(total); + badgeData.text[0] = 'downloads'; badgeData.text[1] = metric(total) + ' total'; } else if (info == 'e') { var endorsement = json.endorsement; @@ -2282,13 +2283,15 @@ cache(function(data, match, sendBadge, request) { } else { badgeData.colorscheme = 'red'; } + badgeData.text[0] = 'endorsement'; if (endorsement != null) { badgeData.text[1] = endorsement; } else { - badgeData.text[1] = 'no endorsement'; + badgeData.text[1] = 'none'; } } else if (info == 'f') { var feedback = json.feedback_score; + badgeData.text[0] = 'score'; if (feedback != null) { badgeData.text[1] = feedback+'%'; badgeData.colorscheme = coveragePercentageColor(feedback); @@ -2327,11 +2330,13 @@ cache(function(data, match, sendBadge, request) { if (info == 'rc') { var releases = json.release_count; badgeData.colorscheme = floorCountColor(releases, 10, 50, 100); - badgeData.text[1] = metric(releases) + ' releases'; + badgeData.text[0] = 'releases'; + badgeData.text[1] = metric(releases); } else if (info == 'mc') { var modules = json.module_count; badgeData.colorscheme = floorCountColor(modules, 5, 10, 50); - badgeData.text[1] = metric(modules) + ' modules'; + badgeData.text[0] = 'modules'; + badgeData.text[1] = metric(modules); } sendBadge(format, badgeData); From 70194a2661dfad1c9e7454fa50234d92e528a37e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:45:06 +0100 Subject: [PATCH 10/11] puppetforge: only sendBadge() once --- server.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/server.js b/server.js index 0b6666f..f457904 100644 --- a/server.js +++ b/server.js @@ -2268,7 +2268,6 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = 'none'; badgeData.colorscheme = 'lightgrey'; } - sendBadge(format, badgeData); } else if (info == 'dt') { var total = json.downloads; badgeData.colorscheme = downloadCountColor(total); @@ -2301,7 +2300,6 @@ cache(function(data, match, sendBadge, request) { } } sendBadge(format, badgeData); - } catch(e) { badgeData.text[1] = 'invalid'; sendBadge(format, badgeData); From ba1fe3b74ef33090c4a12f9303996c500194d307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Thu, 19 Mar 2015 09:48:14 +0100 Subject: [PATCH 11/11] Use === instead of == --- server.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index f457904..61fb73f 100644 --- a/server.js +++ b/server.js @@ -2259,7 +2259,7 @@ cache(function(data, match, sendBadge, request) { return; } try { - if (info == 'v') { + if (info === 'v') { if (json.current_release) { var vdata = versionColor(json.current_release.version); badgeData.text[1] = vdata.version; @@ -2268,16 +2268,16 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = 'none'; badgeData.colorscheme = 'lightgrey'; } - } else if (info == 'dt') { + } else if (info === 'dt') { var total = json.downloads; badgeData.colorscheme = downloadCountColor(total); badgeData.text[0] = 'downloads'; badgeData.text[1] = metric(total) + ' total'; - } else if (info == 'e') { + } else if (info === 'e') { var endorsement = json.endorsement; - if (endorsement == 'approved') { + if (endorsement === 'approved') { badgeData.colorscheme = 'green'; - } else if (endorsement == 'supported') { + } else if (endorsement === 'supported') { badgeData.colorscheme = 'brightgreen'; } else { badgeData.colorscheme = 'red'; @@ -2288,7 +2288,7 @@ cache(function(data, match, sendBadge, request) { } else { badgeData.text[1] = 'none'; } - } else if (info == 'f') { + } else if (info === 'f') { var feedback = json.feedback_score; badgeData.text[0] = 'score'; if (feedback != null) { @@ -2325,12 +2325,12 @@ cache(function(data, match, sendBadge, request) { return; } try { - if (info == 'rc') { + if (info === 'rc') { var releases = json.release_count; badgeData.colorscheme = floorCountColor(releases, 10, 50, 100); badgeData.text[0] = 'releases'; badgeData.text[1] = metric(releases); - } else if (info == 'mc') { + } else if (info === 'mc') { var modules = json.module_count; badgeData.colorscheme = floorCountColor(modules, 5, 10, 50); badgeData.text[0] = 'modules';