From f25f3108566dadea78d5fd103b1ec2e7414d6f8e Mon Sep 17 00:00:00 2001 From: bogdanRada Date: Tue, 15 Jul 2014 11:26:56 +0300 Subject: [PATCH] update gem downloads count --- server.js | 84 ++++++++++++++++++++++++++++++++----------------------- try.html | 8 ++++++ 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/server.js b/server.js index d1be938..61de83c 100644 --- a/server.js +++ b/server.js @@ -590,22 +590,63 @@ cache(function(data, match, sendBadge) { }); })); -// Gem download count for latest version. -camp.route(/^\/gem\/dtv\/(.*)\.(svg|png|gif|jpg)$/, +// Gem download count +camp.route(/^\/gem\/(dt|dtv|dv)\/(.*)\.(svg|png|gif|jpg)$/, cache(function(data, match, sendBadge) { - var repo = match[1]; // eg, rails. - var format = match[2]; - var apiUrl = 'https://rubygems.org/api/v1/gems/' + repo + '.json'; + var info = match[1]; + var site = match[2]; + var splited_url = site.split('/'); + var repo = splited_url[0]; + var version = (splited_url.length > 1) ? splited_url[splited_url.length - 1] : null; + version = (version === "stable") ? version : semver.valid(version); + var format = match[3]; var badgeData = getBadgeData('downloads', data); + var apiUrl = 'https://rubygems.org/api/v1/gems/' + repo + '.json'; + if (info === "dv"){ + apiUrl = 'https://rubygems.org/api/v1/versions/' + repo + '.json'; + } request(apiUrl, { headers: { 'Accept': 'application/atom+json,application/json' } }, function(err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; sendBadge(format, badgeData); } try { - var data = JSON.parse(buffer); - var downloads = data.version_downloads; - badgeData.text[1] = metric(downloads) + ' latest version'; + var data = JSON.parse(buffer); + if (info === "dt") { + var downloads = metric(data.downloads) + " total"; + } + else if (info === "dtv") { + var downloads = metric(data.version_downloads) + " latest version"; + } + else if (info === "dv") { + var downloads = "invalid"; + + if (version !== null && version === "stable") { + + var versions = data.filter(function(ver) { + return ver.prerelease === false; + }).map(function(ver) { + return ver.number; + }); + var stable_version = latestVersion(versions); // found latest stable version + var version_data = data.filter(function(ver) { + return ver.number === stable_version; + })[0]; + downloads = metric(version_data.downloads_count) + " stable version"; + } + else if (version !== null) { + + var version_data = data.filter(function(ver) { + return ver.number === version; + })[0] + + downloads = metric(version_data.downloads_count) + " version " + version; + } + } + else { + var downloads = "invalid"; + } + badgeData.text[1] =downloads; badgeData.colorscheme = downloadCountColor(downloads); sendBadge(format, badgeData); } catch(e) { @@ -615,33 +656,6 @@ cache(function(data, match, sendBadge) { }); })); - -// Gem total download count -camp.route(/^\/gem\/dt\/(.*)\.(svg|png|gif|jpg)$/, -cache(function(data, match, sendBadge) { - var repo = match[1]; // eg, rails. - var format = match[2]; - var apiUrl = 'https://rubygems.org/api/v1/gems/' + repo + '.json'; - var badgeData = getBadgeData('downloads', data); - request(apiUrl, { headers: { 'Accept': 'application/atom+json,application/json' } }, function(err, res, buffer) { - if (err != null) { - badgeData.text[1] = 'inaccessible'; - sendBadge(format, badgeData); - } - try { - var data = JSON.parse(buffer); - var downloads = data.downloads; - badgeData.text[1] = metric(downloads) + ' total'; - badgeData.colorscheme = downloadCountColor(downloads); - sendBadge(format, badgeData); - } catch(e) { - badgeData.text[1] = 'invalid'; - sendBadge(format, badgeData); - } - }); -})); - - // PyPI integration. camp.route(/^\/pypi\/([^\/]+)\/(.*)\.(svg|png|gif|jpg)$/, cache(function(data, match, sendBadge) { diff --git a/try.html b/try.html index d792206..68ae20a 100644 --- a/try.html +++ b/try.html @@ -167,6 +167,14 @@ I made the GitHub Badge Service.

Downloads

+ + + + + + + +
Gem http://img.shields.io/gem/dv/rails/stable.svg
Gem http://img.shields.io/gem/dv/rails/4.1.0.svg
Gem http://img.shields.io/gem/dtv/rails.svg