From f51f15299368925b1ff7a4f2a9b165046c85eedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Mon, 27 Apr 2015 10:00:51 +0200 Subject: [PATCH 1/2] Add an ordinalNumber() function --- server.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server.js b/server.js index 162f34f..e1acf2f 100644 --- a/server.js +++ b/server.js @@ -3636,6 +3636,11 @@ function fetchFromSvg(request, url, cb) { }); } +function ordinalNumber(n) { + var s=["ᵗʰ","ˢᵗ","ⁿᵈ","ʳᵈ"], v=n%100; + return n+(s[(v-20)%10]||s[v]||s[0]); +} + function coveragePercentageColor(percentage) { return floorCountColor(percentage, 80, 90, 100); } From f9e184fadb1e169f50eda0bbe688ab42a0fa3a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Mon, 27 Apr 2015 10:01:03 +0200 Subject: [PATCH 2/2] Add Gem ranking badges --- server.js | 38 ++++++++++++++++++++++++++++++++++++++ try.html | 8 ++++++++ 2 files changed, 46 insertions(+) diff --git a/server.js b/server.js index e1acf2f..0a8c03e 100644 --- a/server.js +++ b/server.js @@ -1275,6 +1275,44 @@ cache(function(data, match, sendBadge, request) { }) })); + +// Gem ranking +camp.route(/^\/gem\/(rt|rd)\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var info = match[1]; // either rt or rd + var repo = match[2]; // eg, "rspec-puppet-facts" + var format = match[3]; + var url = 'http://bestgems.org/api/v1/gems/' + repo; + if (info === 'rt') { + url += '/total_ranking.json'; + } else if (info === 'rd') { + url += '/daily_ranking.json'; + } + var badgeData = getBadgeData('rank', data); + request(url, function(err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(badgeData, format); + } + try { + var data = JSON.parse(buffer); + if (info == 'rt') { + var rank = data[0].total_ranking; + } else if (info === 'rd') { + var rank = data[0].daily_ranking; + } + var count = Math.floor(100000/rank); + badgeData.colorscheme = floorCountColor(count, 10, 50, 100); + badgeData.text[1] = ordinalNumber(rank); + badgeData.text[1] += (info === 'rt') ? ' total' : ' daily'; + sendBadge(format, badgeData); + } catch (e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }) +})); + // PyPI integration. camp.route(/^\/pypi\/([^\/]+)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { diff --git a/try.html b/try.html index 5895415..985135d 100644 --- a/try.html +++ b/try.html @@ -577,6 +577,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/gem/u/raphink.svg + Gems: + + https://img.shields.io/gem/rt/puppet.svg + + Gems: + + https://img.shields.io/gem/rd/facter.svg + DUB: https://img.shields.io/dub/l/vibe-d.svg