From 9d755a3ad0f73f2c7f53be1abad7080bc83e90e3 Mon Sep 17 00:00:00 2001 From: Benno van den Berg Date: Fri, 29 May 2015 17:24:17 +0200 Subject: [PATCH 01/16] Add wercker v3 integration --- index.html | 4 ++++ server.js | 43 ++++++++++++++++++++++++++++++++++++++++++- try.html | 4 ++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 86d14dc..2808d07 100644 --- a/index.html +++ b/index.html @@ -77,6 +77,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/wercker/ci/54330318b4ce963d50020750.svg + Wercker (v3): + + https://img.shields.io/wercker/ci/wercker/docs.svg + TeamCity CodeBetter: https://img.shields.io/teamcity/codebetter/bt428.svg diff --git a/server.js b/server.js index 1d02b9c..1e7913c 100644 --- a/server.js +++ b/server.js @@ -310,7 +310,7 @@ cache(function(data, match, sendBadge, request) { })); // Wercker integration -camp.route(/^\/wercker\/ci\/(.+)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/wercker\/ci\/([a-fA-F0-9]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var projectId = match[1]; // eg, `54330318b4ce963d50020750` var format = match[2]; @@ -349,6 +349,47 @@ cache(function(data, match, sendBadge, request) { }); })); +// Wercker V3 integration +camp.route(/^\/wercker\/ci\/(.+)\/(.+)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var owner = match[1]; + var application = match[2]; + var format = match[3]; + var options = { + method: 'GET', + json: true, + uri: 'https://app.wercker.com/api/v3/applications/' + owner + '/' + application + '/builds?limit=1' + }; + var badgeData = getBadgeData('build', data); + request(options, function(err, res, json) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + var build = json[0]; + + if (build.status === 'finished') { + if (build.result === 'passed') { + badgeData.colorscheme = 'brightgreen'; + badgeData.text[1] = build.result; + } else { + badgeData.colorscheme = 'red'; + badgeData.text[1] = build.result; + } + } else { + badgeData.text[1] = build.status; + } + sendBadge(format, badgeData); + + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // Rust download and version integration camp.route(/^\/crates\/(d|v|dv|l)\/([A-Za-z0-9_-]+)(?:\/([0-9.]+))?\.(svg|png|gif|jpg|json)$/, cache(function (data, match, sendBadge, request) { diff --git a/try.html b/try.html index c1fa29c..590c252 100644 --- a/try.html +++ b/try.html @@ -76,6 +76,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/wercker/ci/54330318b4ce963d50020750.svg + Wercker (v3): + + https://img.shields.io/wercker/ci/wercker/docs.svg + TeamCity CodeBetter: https://img.shields.io/teamcity/codebetter/bt428.svg From c948ece0978bce2249a5202cb70f8deff2e37537 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sun, 31 May 2015 13:24:04 +0200 Subject: [PATCH 02/16] GitHub logos for social badges See #337 --- load-logos.js | 20 ++++++++++++++++++++ logo/github.svg | 3 +++ server.js | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 load-logos.js create mode 100644 logo/github.svg diff --git a/load-logos.js b/load-logos.js new file mode 100644 index 0000000..3aa8407 --- /dev/null +++ b/load-logos.js @@ -0,0 +1,20 @@ +var fs = require('fs'); +var path = require('path'); + +var loadLogos = function() { + var logos = {}; + var logoFiles = fs.readdirSync(path.join(__dirname, 'logo')); + logoFiles.forEach(function(filename) { + if (filename[0] === '.') { return; } + // filename is eg, github.svg + var svg = fs.readFileSync( + path.join(__dirname, 'logo', filename)).toString(); + + // eg, github + var name = filename.slice(0, -('.svg'.length)); + logos[name] = 'data:image/svg+xml;base64,' + Buffer(svg).toString('base64'); + }); + return logos; +}; + +module.exports = loadLogos; diff --git a/logo/github.svg b/logo/github.svg new file mode 100644 index 0000000..c81a5ba --- /dev/null +++ b/logo/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/server.js b/server.js index 1d02b9c..0335cb4 100644 --- a/server.js +++ b/server.js @@ -12,6 +12,7 @@ var fs = require('fs'); var LruCache = require('./lru-cache.js'); var badge = require('./badge.js'); var svg2img = require('./svg-to-img.js'); +var loadLogos = require('./load-logos.js'); var querystring = require('querystring'); var serverSecrets; try { @@ -23,6 +24,7 @@ var semver = require('semver'); var serverStartTime = new Date((new Date()).toGMTString()); var validTemplates = ['default', 'plastic', 'flat', 'flat-square', 'social']; +var logos = loadLogos(); // Analytics @@ -176,7 +178,8 @@ function cache(f) { } var cacheIndex = match[0] + '?label=' + data.label + '&style=' + data.style - + '&logo=' + data.logo + '&logoWidth=' + data.logoWidth; + + '&logo=' + data.logo + '&logoWidth=' + data.logoWidth + + '&link=' + data.link; // Should we return the data right away? var cached = requestCache.get(cacheIndex); var cachedVersionSent = false; @@ -2109,6 +2112,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('tag', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2149,6 +2155,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('release', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2192,6 +2201,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('downloads', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2239,6 +2251,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('issues', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2277,6 +2292,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('forks', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2316,6 +2334,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('stars', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2352,6 +2373,9 @@ cache(function(data, match, sendBadge, request) { + '&client_secret=' + serverSecrets.gh_client_secret; } var badgeData = getBadgeData('followers', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // A special User-Agent is required: // http://developer.github.com/v3/#user-agent-required request(apiUrl, { headers: githubHeaders }, function(err, res, buffer) { @@ -2383,6 +2407,9 @@ cache(function(data, match, sendBadge, request) { var format = match[3]; var apiUrl = 'https://api.github.com/repos/' + user + '/' + repo; var badgeData = getBadgeData('license', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.github; + } // Using our OAuth App secret grants us 5000 req/hour // instead of the standard 60 req/hour. if (serverSecrets) { @@ -3692,7 +3719,7 @@ function getLabel(label, data) { return data.label || label; } -// data (URL query) can include `label`, `style`, `logo`, `logoWidth`. +// data (URL query) can include `label`, `style`, `logo`, `logoWidth`, `link`. function getBadgeData(defaultLabel, data) { var label = getLabel(defaultLabel, data); var template = data.style || 'default'; @@ -3709,7 +3736,8 @@ function getBadgeData(defaultLabel, data) { colorscheme: 'lightgrey', template: template, logo: data.logo, - logoWidth: +data.logoWidth + logoWidth: +data.logoWidth, + links: data.link, }; } From 7e915f39eb527e4cd712c248e05fc4703f41a07c Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sun, 31 May 2015 13:44:36 +0200 Subject: [PATCH 03/16] Gratipay logo See #337 --- logo/github.svg | 2 +- logo/gratipay.svg | 3 +++ server.js | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 logo/gratipay.svg diff --git a/logo/github.svg b/logo/github.svg index c81a5ba..99e8eb5 100644 --- a/logo/github.svg +++ b/logo/github.svg @@ -1,3 +1,3 @@ - + diff --git a/logo/gratipay.svg b/logo/gratipay.svg new file mode 100644 index 0000000..fcf505e --- /dev/null +++ b/logo/gratipay.svg @@ -0,0 +1,3 @@ + + + diff --git a/server.js b/server.js index 0335cb4..3a25522 100644 --- a/server.js +++ b/server.js @@ -650,6 +650,9 @@ cache(function(data, match, sendBadge, request) { var format = match[3]; var apiUrl = 'https://www.gratipay.com/' + user + '/public.json'; var badgeData = getBadgeData('tips', data); + if (badgeData.template === 'social') { + badgeData.logo = badgeData.logo || logos.gratipay; + } request(apiUrl, function dealWithData(err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; From 91d35c2b8cb676d01a407049393e81944f0ab1b1 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Mon, 1 Jun 2015 23:41:11 +0200 Subject: [PATCH 04/16] Remove old Wercker from the examples See #456 --- index.html | 8 ++++---- try.html | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/index.html b/index.html index 2808d07..c02e16f 100644 --- a/index.html +++ b/index.html @@ -74,10 +74,6 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/travis/joyent/node/v0.6.svg Wercker: - - https://img.shields.io/wercker/ci/54330318b4ce963d50020750.svg - - Wercker (v3): https://img.shields.io/wercker/ci/wercker/docs.svg @@ -475,6 +471,10 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/david/dev/strongloop/express.svg + David: + + https://img.shields.io/david/optional/elnounch/byebye.svg + David: https://img.shields.io/david/peer/webcomponents/generator-element.svg diff --git a/try.html b/try.html index 590c252..917b4ce 100644 --- a/try.html +++ b/try.html @@ -73,10 +73,6 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/travis/joyent/node/v0.6.svg Wercker: - - https://img.shields.io/wercker/ci/54330318b4ce963d50020750.svg - - Wercker (v3): https://img.shields.io/wercker/ci/wercker/docs.svg From 7030f6e8913af1b6ecb46055f1b99ff3f04da94c Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Tue, 2 Jun 2015 09:50:58 +0200 Subject: [PATCH 05/16] Use the donate social button in the website Part of #337 --- try.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/try.html b/try.html index 917b4ce..e32b49d 100644 --- a/try.html +++ b/try.html @@ -703,7 +703,7 @@ And tell us, we might be able to bring it to you anyway! -Tip us! +Donate to us! From 65cb0b77194796015c89fcd59385446bff13e2aa Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Wed, 3 Jun 2015 23:36:16 +0200 Subject: [PATCH 06/16] website: update donate button --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index c02e16f..c262b78 100644 --- a/index.html +++ b/index.html @@ -704,7 +704,7 @@ And tell us, we might be able to bring it to you anyway! -Tip us! +Donate to us! From bfaa37af18fca028106f728138668620eaa18d6c Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 4 Jun 2015 13:02:13 -0300 Subject: [PATCH 07/16] added support for shippable --- server.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/server.js b/server.js index f844bce..1cc01cd 100644 --- a/server.js +++ b/server.js @@ -312,6 +312,41 @@ cache(function(data, match, sendBadge, request) { }); })); +// Shippable integration +camp.route(/^\/shippable?\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var project = match[2]; // eg, 54d119db5ab6cc13528ab183 + var branch = match[3]; + var format = match[4]; + var url = 'https://api.shippable.com/projects/' + project + '/badge'; + if (branch != null) { + url += '?branchName=' + branch; + } + var badgeData = getBadgeData('build', data); + fetchFromSvg(request, url, function(err, res) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + return; + } + try { + badgeData.text[1] = res; + if (res === 'shippable') { + badgeData.colorscheme = 'brightgreen'; + } else if (res === 'unshippable') { + badgeData.colorscheme = 'red'; + } else { + badgeData.text[1] = res; + } + sendBadge(format, badgeData); + + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // Wercker integration camp.route(/^\/wercker\/ci\/([a-fA-F0-9]+)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { From 67e0549d01ea0c37b7c5fb7c745cfc933aefcb1e Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sat, 6 Jun 2015 11:43:59 +0200 Subject: [PATCH 08/16] New coverage badge --- coverage.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coverage.svg b/coverage.svg index 0cad02c..5337bed 100644 --- a/coverage.svg +++ b/coverage.svg @@ -1 +1 @@ -coveragecoverage76.5%76.5% \ No newline at end of file +coveragecoverage76.8%76.8% \ No newline at end of file From 4cc9ca9e2d1f2720914f1de663dee9fb1bb13125 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sat, 6 Jun 2015 13:30:07 +0200 Subject: [PATCH 09/16] Fixed #462 --- server.js | 6 +++--- try.html | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 1cc01cd..54a7609 100644 --- a/server.js +++ b/server.js @@ -315,9 +315,9 @@ cache(function(data, match, sendBadge, request) { // Shippable integration camp.route(/^\/shippable?\/([^\/]+)(?:\/(.+))?\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { - var project = match[2]; // eg, 54d119db5ab6cc13528ab183 - var branch = match[3]; - var format = match[4]; + var project = match[1]; // eg, 54d119db5ab6cc13528ab183 + var branch = match[2]; + var format = match[3]; var url = 'https://api.shippable.com/projects/' + project + '/badge'; if (branch != null) { url += '?branchName=' + branch; diff --git a/try.html b/try.html index e32b49d..cba121c 100644 --- a/try.html +++ b/try.html @@ -112,6 +112,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/circleci/project/BrightFlair/PHP.Gt/master.svg + Shippable: + + https://img.shields.io/shippable/54d119db5ab6cc13528ab183.svg + + Shippable branch: + + https://img.shields.io/shippable/54d119db5ab6cc13528ab183/master.svg + Jenkins: https://img.shields.io/jenkins/s/https/jenkins.qa.ubuntu.com/precise-desktop-amd64_default.svg From 0b2da246b7659c4583527783ebee6b11fb72562c Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sat, 6 Jun 2015 13:31:08 +0200 Subject: [PATCH 10/16] Default user agent. --- server.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server.js b/server.js index 54a7609..0f0fd7f 100644 --- a/server.js +++ b/server.js @@ -225,6 +225,8 @@ function cache(f) { } else { options = uri; } + options.headers = options.headers || {}; + options.headers['User-Agent'] = options.headers['User-Agent'] || 'Shields.io'; return request(options, function(err, res, json) { if (res != null && res.headers != null) { var cacheControl = res.headers['cache-control']; From 83bafa8e5107e4ff65addb4d5193c4d42e3296fa Mon Sep 17 00:00:00 2001 From: Michael Klement Date: Sun, 7 Jun 2015 09:34:21 -0400 Subject: [PATCH 11/16] Badge text modified to reflect actual style parameter. The badge demonstrating use of style `flat-square` was titled "flat-square*d*" (extra "d" at the end), which invites confusion. --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index c262b78..9c30ab1 100644 --- a/index.html +++ b/index.html @@ -680,8 +680,8 @@ The following styles are available (flat is the default as of Feb 1st 2015): https://img.shields.io/badge/style-flat-green.svg?style=flat - - https://img.shields.io/badge/style-flat--squared-green.svg?style=flat-square + + https://img.shields.io/badge/style-flat--square-green.svg?style=flat-square From dee58b43c459eb8cc46f5bb780340657996c156a Mon Sep 17 00:00:00 2001 From: Jiangge Zhang Date: Mon, 8 Jun 2015 00:52:30 +0800 Subject: [PATCH 12/16] Add wheel/python-version/python-implementation/status badage for PyPI. To replace the pypipins: https://github.com/badges/pypipins/issues/39 --- server.js | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ try.html | 16 +++++++++++++ 2 files changed, 83 insertions(+) diff --git a/server.js b/server.js index 54a7609..729a5bd 100644 --- a/server.js +++ b/server.js @@ -1481,6 +1481,73 @@ cache(function(data, match, sendBadge, request) { badgeData.colorscheme = 'blue'; } sendBadge(format, badgeData); + } else if (info == 'wheel') { + var releases = data.releases[data.info.version]; + var hasWheel = false; + for (var i in releases) { + if (releases[i].packagetype == 'wheel' || + releases[i].packagetype == 'bdist_wheel') { + hasWheel = true; + break; + } + } + badgeData.text[0] = 'wheel'; + badgeData.text[1] = hasWheel ? 'yes' : 'no'; + badgeData.colorscheme = hasWheel ? 'brightgreen' : 'red'; + sendBadge(format, badgeData); + } else if (info == 'py_versions') { + var versions = []; + var pattern = /^Programming Language \:\: Python \:\: (\d\.\d)$/; + for (var i in data.info.classifiers) { + var matched = pattern.exec(data.info.classifiers[i]); + if (matched && matched[1]) { + versions.push(matched[1]); + } + } + if (!versions.length) { + versions.push('not found'); + } + badgeData.text[0] = 'python'; + badgeData.text[1] = versions.sort().join(', '); + badgeData.colorscheme = 'blue'; + sendBadge(format, badgeData); + } else if (info == 'implementation') { + var implementations = []; + var pattern = /^Programming Language \:\: Python \:\: Implementation \:\: (\S+)$/; + for (var i in data.info.classifiers) { + var matched = pattern.exec(data.info.classifiers[i]); + if (matched && matched[1]) { + implementations.push(matched[1].toLowerCase()); + } + } + if (!implementations.length) { + implementations.push('cpython'); // assume CPython + } + badgeData.text[0] = 'implementation'; + badgeData.text[1] = implementations.sort().join(', '); + badgeData.colorscheme = 'blue'; + sendBadge(format, badgeData); + } else if (info == 'status') { + var pattern = /^Development Status \:\: ([1-7]) - (\S+)$/; + var statusColors = { + '1': 'red', '2': 'red', '3': 'red', '4': 'yellow', + '5': 'brightgreen', '6': 'brightgreen', '7': 'red'}; + var statusCode = '1', statusText = 'unknown'; + for (var i in data.info.classifiers) { + var matched = pattern.exec(data.info.classifiers[i]); + if (matched && matched[1] && matched[2]) { + statusCode = matched[1]; + statusText = matched[2].toLowerCase().replace('-', '--'); + if (statusText == 'production/stable') { + statusText = 'stable'; + } + break; + } + } + badgeData.text[0] = 'status'; + badgeData.text[1] = statusText; + badgeData.colorscheme = statusColors[statusCode]; + sendBadge(format, badgeData); } } catch(e) { badgeData.text[1] = 'invalid'; diff --git a/try.html b/try.html index cba121c..6ac6f25 100644 --- a/try.html +++ b/try.html @@ -518,6 +518,22 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/pypi/l/Django.svg + PyPI: + + https://img.shields.io/pypi/wheel/Django.svg + + PyPI: + + https://img.shields.io/pypi/py_versions/Django.svg + + PyPI: + + https://img.shields.io/pypi/implementation/Django.svg + + PyPI: + + https://img.shields.io/pypi/status/Django.svg + Hex.pm: https://img.shields.io/hexpm/l/plug.svg From 42a43e372fe3e56514b58e50ce2ab2e6c0aa154e Mon Sep 17 00:00:00 2001 From: Jiangge Zhang Date: Mon, 8 Jun 2015 03:42:30 +0800 Subject: [PATCH 13/16] Use regular loops instead of for-in. --- server.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index 729a5bd..73edfa9 100644 --- a/server.js +++ b/server.js @@ -1484,7 +1484,7 @@ cache(function(data, match, sendBadge, request) { } else if (info == 'wheel') { var releases = data.releases[data.info.version]; var hasWheel = false; - for (var i in releases) { + for (var i = 0; i < releases.length; i++) { if (releases[i].packagetype == 'wheel' || releases[i].packagetype == 'bdist_wheel') { hasWheel = true; @@ -1498,7 +1498,7 @@ cache(function(data, match, sendBadge, request) { } else if (info == 'py_versions') { var versions = []; var pattern = /^Programming Language \:\: Python \:\: (\d\.\d)$/; - for (var i in data.info.classifiers) { + for (var i = 0; i < data.info.classifiers.length; i++) { var matched = pattern.exec(data.info.classifiers[i]); if (matched && matched[1]) { versions.push(matched[1]); @@ -1514,7 +1514,7 @@ cache(function(data, match, sendBadge, request) { } else if (info == 'implementation') { var implementations = []; var pattern = /^Programming Language \:\: Python \:\: Implementation \:\: (\S+)$/; - for (var i in data.info.classifiers) { + for (var i = 0; i < data.info.classifiers.length; i++) { var matched = pattern.exec(data.info.classifiers[i]); if (matched && matched[1]) { implementations.push(matched[1].toLowerCase()); @@ -1533,7 +1533,7 @@ cache(function(data, match, sendBadge, request) { '1': 'red', '2': 'red', '3': 'red', '4': 'yellow', '5': 'brightgreen', '6': 'brightgreen', '7': 'red'}; var statusCode = '1', statusText = 'unknown'; - for (var i in data.info.classifiers) { + for (var i = 0; i < data.info.classifiers.length; i++) { var matched = pattern.exec(data.info.classifiers[i]); if (matched && matched[1] && matched[2]) { statusCode = matched[1]; From 31de01b5c4c284c1f688dfad3230b5062738a2ea Mon Sep 17 00:00:00 2001 From: Jiangge Zhang Date: Mon, 8 Jun 2015 03:43:49 +0800 Subject: [PATCH 14/16] remove underline in url. --- server.js | 2 +- try.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index 73edfa9..00d923c 100644 --- a/server.js +++ b/server.js @@ -1495,7 +1495,7 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = hasWheel ? 'yes' : 'no'; badgeData.colorscheme = hasWheel ? 'brightgreen' : 'red'; sendBadge(format, badgeData); - } else if (info == 'py_versions') { + } else if (info == 'pyversions') { var versions = []; var pattern = /^Programming Language \:\: Python \:\: (\d\.\d)$/; for (var i = 0; i < data.info.classifiers.length; i++) { diff --git a/try.html b/try.html index 6ac6f25..6fd78ac 100644 --- a/try.html +++ b/try.html @@ -523,8 +523,8 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/pypi/wheel/Django.svg PyPI: - - https://img.shields.io/pypi/py_versions/Django.svg + + https://img.shields.io/pypi/pyversions/Django.svg PyPI: From 59e0a0644ca93651346ed504d27fceedc2df89f4 Mon Sep 17 00:00:00 2001 From: Jiangge Zhang Date: Mon, 8 Jun 2015 03:45:33 +0800 Subject: [PATCH 15/16] Use strict comparison. --- server.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index 00d923c..6c23f31 100644 --- a/server.js +++ b/server.js @@ -1471,22 +1471,22 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = vdata.version; badgeData.colorscheme = vdata.color; sendBadge(format, badgeData); - } else if (info == 'l') { + } else if (info === 'l') { var license = data.info.license; badgeData.text[0] = 'license'; - if (license == null || license == 'UNKNOWN') { + if (license === null || license === 'UNKNOWN') { badgeData.text[1] = 'Unknown'; } else { badgeData.text[1] = license; badgeData.colorscheme = 'blue'; } sendBadge(format, badgeData); - } else if (info == 'wheel') { + } else if (info === 'wheel') { var releases = data.releases[data.info.version]; var hasWheel = false; for (var i = 0; i < releases.length; i++) { - if (releases[i].packagetype == 'wheel' || - releases[i].packagetype == 'bdist_wheel') { + if (releases[i].packagetype === 'wheel' || + releases[i].packagetype === 'bdist_wheel') { hasWheel = true; break; } @@ -1495,7 +1495,7 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = hasWheel ? 'yes' : 'no'; badgeData.colorscheme = hasWheel ? 'brightgreen' : 'red'; sendBadge(format, badgeData); - } else if (info == 'pyversions') { + } else if (info === 'pyversions') { var versions = []; var pattern = /^Programming Language \:\: Python \:\: (\d\.\d)$/; for (var i = 0; i < data.info.classifiers.length; i++) { @@ -1511,7 +1511,7 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = versions.sort().join(', '); badgeData.colorscheme = 'blue'; sendBadge(format, badgeData); - } else if (info == 'implementation') { + } else if (info === 'implementation') { var implementations = []; var pattern = /^Programming Language \:\: Python \:\: Implementation \:\: (\S+)$/; for (var i = 0; i < data.info.classifiers.length; i++) { @@ -1527,7 +1527,7 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = implementations.sort().join(', '); badgeData.colorscheme = 'blue'; sendBadge(format, badgeData); - } else if (info == 'status') { + } else if (info === 'status') { var pattern = /^Development Status \:\: ([1-7]) - (\S+)$/; var statusColors = { '1': 'red', '2': 'red', '3': 'red', '4': 'yellow', From 0854d8bf916f9b8f4e8682cd5a5b361acd21e798 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Sun, 7 Jun 2015 21:57:05 +0200 Subject: [PATCH 16/16] PyPI fixes and prevent unknown requests from failing bad See #465 --- server.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 85266dd..e749316 100644 --- a/server.js +++ b/server.js @@ -1540,7 +1540,7 @@ cache(function(data, match, sendBadge, request) { if (matched && matched[1] && matched[2]) { statusCode = matched[1]; statusText = matched[2].toLowerCase().replace('-', '--'); - if (statusText == 'production/stable') { + if (statusText === 'production/stable') { statusText = 'stable'; } break; @@ -1550,6 +1550,10 @@ cache(function(data, match, sendBadge, request) { badgeData.text[1] = statusText; badgeData.colorscheme = statusColors[statusCode]; sendBadge(format, badgeData); + } else { + // That request is incorrect. + badgeData.text[1] = 'request unknown'; + sendBadge(format, badgeData); } } catch(e) { badgeData.text[1] = 'invalid';