From 0f69b6809ddd0e5e7e0d7412351c5593dee6654b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 24 Feb 2015 11:54:38 +0100 Subject: [PATCH 01/15] Add CPAN integration --- server.js | 34 ++++++++++++++++++++++++++++++++++ try.html | 8 ++++++++ 2 files changed, 42 insertions(+) diff --git a/server.js b/server.js index 0d48d2c..1538ad9 100644 --- a/server.js +++ b/server.js @@ -2929,6 +2929,40 @@ cache(function(data, match, sendBadge, request) { }); })); +camp.route(/^\/cpan\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var info = match[1]; // either `v` or `l` + var pkg = match[2]; // eg, Config-Augeas + var format = match[3]; + var badgeData = getBadgeData('cpan', data); + var url = 'https://api.metacpan.org/v0/release/'+pkg; + request(url, function(err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + var data = JSON.parse(buffer); + + if (info == 'v') { + var version = data.version; + var vdata = versionColor(version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + } else if (info == 'l') { + var license = data.license[0]; + badgeData.text[1] = license; + badgeData.colorscheme = 'blue'; + } + sendBadge(format, badgeData); + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // Any badge. camp.route(/^\/(:|badge\/)(([^-]|--)+)-(([^-]|--)+)-(([^-]|--)+)\.(svg|png|gif|jpg)$/, function(data, match, end, ask) { diff --git a/try.html b/try.html index 5591f28..8b2faef 100644 --- a/try.html +++ b/try.html @@ -370,6 +370,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/apm/v/vim-mode.svg + CPAN: + + https://img.shields.io/cpan/v/Config-Augeas.svg +

Miscellaneous

@@ -442,6 +446,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/cocoapods/l/AFNetworking.svg + CPAN: + + https://img.shields.io/cpan/l/Config-Augeas.svg + CocoaPods: https://img.shields.io/cocoapods/p/AFNetworking.svg From 3c84c82b50a5adb4d9fffdd5f649143fd906c122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 24 Feb 2015 21:21:10 +0100 Subject: [PATCH 02/15] Use === instead of == --- server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 1538ad9..1fb3606 100644 --- a/server.js +++ b/server.js @@ -2945,12 +2945,12 @@ cache(function(data, match, sendBadge, request) { try { var data = JSON.parse(buffer); - if (info == 'v') { + if (info === 'v') { var version = data.version; var vdata = versionColor(version); badgeData.text[1] = vdata.version; badgeData.colorscheme = vdata.color; - } else if (info == 'l') { + } else if (info === 'l') { var license = data.license[0]; badgeData.text[1] = license; badgeData.colorscheme = 'blue'; From 45da60ffd9e8fb9e99d49ece7d78b8831368739c Mon Sep 17 00:00:00 2001 From: Konstantin Stepanov Date: Fri, 13 Feb 2015 13:45:04 +0300 Subject: [PATCH 03/15] rust license support --- server.js | 70 ++++++++++++++++++++++++++++++++++++------------------- try.html | 4 ++++ 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/server.js b/server.js index 1fb3606..f9fc53d 100644 --- a/server.js +++ b/server.js @@ -348,17 +348,59 @@ cache(function(data, match, sendBadge, request) { })); // Rust download and version integration -camp.route(/^\/crates\/(d|v|dv)\/([A-Za-z0-9_-]+)(?:\/([0-9.]+))?\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/crates\/(d|v|dv|l)\/([A-Za-z0-9_-]+)(?:\/([0-9.]+))?\.(svg|png|gif|jpg|json)$/, cache(function (data, match, sendBadge, request) { var mode = match[1]; // d - downloads (total or for version), v - (latest) version, dv - downloads (for latest version) var crate = match[2]; // crate name, e.g. rustc-serialize var version = match[3]; // crate version in semver format, optional, e.g. 0.1.2 var format = match[4]; + var modes = { + 'd': { + name: 'downloads', + version: true, + process: function (data, badgeData) { + downloads = data.crate? data.crate.downloads: data.version.downloads; + version = data.version && data.version.num; + badgeData.text[1] = metric(downloads) + (version? ' version ' + version: ' total'); + badgeData.colorscheme = downloadCountColor(downloads); + } + }, + 'dv': { + name: 'downloads', + version: true, + process: function (data, badgeData) { + downloads = data.version? data.version.downloads: data.versions[0].downloads; + version = data.version && data.version.num; + badgeData.text[1] = metric(downloads) + (version? ' version ' + version: ' latest version'); + badgeData.colorscheme = downloadCountColor(downloads); + } + }, + 'v': { + name: 'crates.io', + version: true, + process: function (data, badgeData) { + version = data.version? data.version.num: data.crate.max_version; + var vdata = versionColor(version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + } + }, + 'l': { + name: 'license', + version: false, + process: function (data, badgeData) { + badgeData.text[1] = data.crate.license; + badgeData.colorscheme = 'blue'; + } + } + }; + var behavior = modes[mode]; var apiUrl = 'https://crates.io/api/v1/crates/' + crate; - if (version != null) { + if (version != null && behavior.version) { apiUrl += '/' + version; } - var badgeData = getBadgeData(mode == 'v'? 'crates.io': 'downloads', data); + + var badgeData = getBadgeData(behavior.name, data); request(apiUrl, { headers: { 'Accept': 'application/json' } }, function (err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; @@ -366,27 +408,7 @@ cache(function (data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); - var downloads; - - if (mode == 'd') { - downloads = data.crate? data.crate.downloads: data.version.downloads; - version = data.version && data.version.num; - badgeData.text[1] = metric(downloads) + (version? ' version ' + version: ' total'); - badgeData.colorscheme = downloadCountColor(downloads); - - } else if (mode == 'dv') { - downloads = data.version? data.version.downloads: data.versions[0].downloads; - version = data.version && data.version.num; - badgeData.text[1] = metric(downloads) + (version? ' version ' + version: ' latest version'); - badgeData.colorscheme = downloadCountColor(downloads); - - } else if (mode == 'v') { - version = data.version? data.version.num: data.crate.max_version; - var vdata = versionColor(version); - badgeData.text[1] = vdata.version; - badgeData.colorscheme = vdata.color; - } - + behavior.process(data, badgeData); sendBadge(format, badgeData); } catch (e) { diff --git a/try.html b/try.html index 8b2faef..0f48b1c 100644 --- a/try.html +++ b/try.html @@ -414,6 +414,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/hackage-deps/v/lens.svg + Crates.io: + + https://img.shields.io/crates/l/rustc-serialize.svg + Requires.io: https://img.shields.io/requires/github/celery/celery.svg From 41939be6fa6bf6049e5561b3521a38667d888e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Mon, 23 Feb 2015 23:27:17 +0100 Subject: [PATCH 04/15] Add CTAN integration --- server.js | 27 +++++++++++++++++++++++++++ try.html | 4 ++++ 2 files changed, 31 insertions(+) diff --git a/server.js b/server.js index f9fc53d..88ce3bc 100644 --- a/server.js +++ b/server.js @@ -2951,6 +2951,7 @@ cache(function(data, match, sendBadge, request) { }); })); +// CPAN integration. camp.route(/^\/cpan\/([^\/]+)\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var info = match[1]; // either `v` or `l` @@ -2985,6 +2986,32 @@ cache(function(data, match, sendBadge, request) { }); })); +// CTAN integration. +camp.route(/^\/ctan\/v\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var pkg = match[1]; // eg, tex + var format = match[2]; + var url = 'http://www.ctan.org/json/pkg/'+pkg; + var badgeData = getBadgeData('ctan', data); + request(url, function (err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(badgeData, format); + } + try { + var data = JSON.parse(buffer); + var version = data.version.number; + var vdata = versionColor(version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + sendBadge(format, badgeData); + } catch (e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + })} +)); + // Any badge. camp.route(/^\/(:|badge\/)(([^-]|--)+)-(([^-]|--)+)-(([^-]|--)+)\.(svg|png|gif|jpg)$/, function(data, match, end, ask) { diff --git a/try.html b/try.html index 0f48b1c..6ea8972 100644 --- a/try.html +++ b/try.html @@ -374,6 +374,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/cpan/v/Config-Augeas.svg + CTAN: + + https://img.shields.io/ctan/v/tex.svg +

Miscellaneous

From ea86aec5a7773661bd3615e7d41582aec77cc8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Mon, 23 Feb 2015 23:42:18 +0100 Subject: [PATCH 05/15] Add CTAN license badge --- server.js | 27 ++++++++++++++++++++------- try.html | 4 ++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/server.js b/server.js index 88ce3bc..a4fed97 100644 --- a/server.js +++ b/server.js @@ -2987,10 +2987,11 @@ cache(function(data, match, sendBadge, request) { })); // CTAN integration. -camp.route(/^\/ctan\/v\/([^\/]+)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/ctan\/([^\/])\/([^\/]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var pkg = match[1]; // eg, tex - var format = match[2]; + var info = match[1]; // either `v` or `l` + var pkg = match[2]; // eg, tex + var format = match[3]; var url = 'http://www.ctan.org/json/pkg/'+pkg; var badgeData = getBadgeData('ctan', data); request(url, function (err, res, buffer) { @@ -3000,11 +3001,23 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); + + if (info == 'v') { var version = data.version.number; - var vdata = versionColor(version); - badgeData.text[1] = vdata.version; - badgeData.colorscheme = vdata.color; - sendBadge(format, badgeData); + var vdata = versionColor(version); + badgeData.text[1] = vdata.version; + badgeData.colorscheme = vdata.color; + sendBadge(format, badgeData); + } else if (info == 'l') { + var license = data.license; + if (license == '') { + badgeData.text[1] = 'Unknown'; + } else { + badgeData.text[1] = license; + badgeData.colorscheme = 'blue'; + } + sendBadge(format, badgeData); + } } catch (e) { badgeData.text[1] = 'invalid'; sendBadge(format, badgeData); diff --git a/try.html b/try.html index 6ea8972..396774f 100644 --- a/try.html +++ b/try.html @@ -458,6 +458,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/cpan/l/Config-Augeas.svg + CTAN: + + https://img.shields.io/ctan/l/tex.svg + CocoaPods: https://img.shields.io/cocoapods/p/AFNetworking.svg From 23a2d3dcdfd83f67a8405fa8a4ca8b3ac8b3c6a6 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Tue, 24 Feb 2015 14:31:54 +0100 Subject: [PATCH 06/15] Autoselect input in markup dialog Some code inspiration from @WouterDS. See #371. --- try.html | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/try.html b/try.html index 396774f..690e7f2 100644 --- a/try.html +++ b/try.html @@ -733,6 +733,8 @@ is where the current server got started.