From dee58b43c459eb8cc46f5bb780340657996c156a Mon Sep 17 00:00:00 2001 From: Jiangge Zhang Date: Mon, 8 Jun 2015 00:52:30 +0800 Subject: [PATCH 1/4] 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 54a76091e5231..729a5bded785a 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 cba121ca5555f..6ac6f2587c59c 100644 --- a/try.html +++ b/try.html @@ -518,6 +518,22 @@

Miscellaneous

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 2/4] 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 729a5bded785a..73edfa98bfdc1 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 3/4] 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 73edfa98bfdc1..00d923c6fb636 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 6ac6f2587c59c..6fd78ac101f68 100644 --- a/try.html +++ b/try.html @@ -523,8 +523,8 @@

Miscellaneous

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 4/4] Use strict comparison. --- server.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server.js b/server.js index 00d923c6fb636..6c23f313c66cf 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',