From 62dcf40aaf663a0c0d8416cb77ae1e8c8f074b2f Mon Sep 17 00:00:00 2001 From: Konstantin Stepanov Date: Tue, 3 Feb 2015 19:01:05 +0300 Subject: [PATCH] add rust's crates.io support (downloads) --- server.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ try.html | 12 ++++++++++++ 2 files changed, 61 insertions(+) diff --git a/server.js b/server.js index 09bd9b3..e56c690 100644 --- a/server.js +++ b/server.js @@ -347,6 +347,55 @@ 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)$/, +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 apiUrl = 'https://crates.io/api/v1/crates/' + crate; + if (version != null) { + apiUrl += '/' + version; + } + var badgeData = getBadgeData(mode == 'v'? 'crates.io': 'downloads', data); + request(apiUrl, { headers: { 'Accept': 'application/json' } }, function (err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(badgeData, format); + } + 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; + } + + sendBadge(format, badgeData); + + } catch (e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // AppVeyor CI integration. camp.route(/^\/appveyor\/ci\/([^\/]+\/[^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { diff --git a/try.html b/try.html index 51f83c5..22d210b 100644 --- a/try.html +++ b/try.html @@ -211,6 +211,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/pypi/dd/Django.svg + Crates.io: + + https://img.shields.io/crates/d/rustc-serialize.svg + + Crates.io: + + https://img.shields.io/crates/dv/rustc-serialize.svg + Packagist: https://img.shields.io/packagist/dm/doctrine/orm.svg @@ -282,6 +290,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/hackage/v/lens.svg + Crates.io: + + https://img.shields.io/crates/v/rustc-serialize.svg + Packagist: https://img.shields.io/packagist/v/symfony/symfony.svg