From 4fc5a0d73d98b219aaa847e7d299711251e3e57e Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 15:33:55 +0000 Subject: [PATCH 01/11] Add CircleCI integration block --- server.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/server.js b/server.js index 9c7998c..750bba9 100644 --- a/server.js +++ b/server.js @@ -2781,6 +2781,44 @@ cache(function(data, match, sendBadge, request) { }); })); +// CircleCI build integration. +// https://circleci.com/api/v1/project/BrightFlair/PHP.Gt?circle-token=0a5143728784b263d9f0238b8d595522689b3af2&limit=1&filter=completed +camp.route(/^\/circleci\/project\/(.*)\.(svg|png|gif|jpg|json)$/, +cache(function(data, match, sendBadge, request) { + var userRepo = match[1]; // eg, `doctrine/orm`. + var format = match[2]; + var apiUrl = 'https://circleci.com/api/v1/project/' + + userRepo + + '?circle-token=0a5143728784b263d9f0238b8d595522689b3af2' + + '&limit=1&filter=completed'; + var badgeData = getBadgeData('CircleCI', data); + request(apiUrl, function(err, res, buffer) { + if (err != null) { + badgeData.text[1] = 'inaccessible'; + sendBadge(format, badgeData); + } + try { + var data = JSON.parse(buffer); + var unstable = function(ver) { return /dev/.test(ver); }; + // Grab the latest stable version, or an unstable + var version = data[0].branch; + badgeData.text[1] = version; + if (/^\d/.test(badgeData.text[1])) { + badgeData.text[1] = 'v' + version; + } + if (version[0] === '0' || /dev/.test(version)) { + badgeData.colorscheme = 'orange'; + } else { + badgeData.colorscheme = 'blue'; + } + sendBadge(format, badgeData); + } catch(e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); + } + }); +})); + // Any badge. camp.route(/^\/(:|badge\/)(([^-]|--)+)-(([^-]|--)+)-(([^-]|--)+)\.(svg|png|gif|jpg)$/, function(data, match, end, ask) { From 90eafcc670cac2075937bdcdd060e3f88b7450d5 Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 15:50:05 +0000 Subject: [PATCH 02/11] Implement badge response for CircleCI --- server.js | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/server.js b/server.js index 750bba9..6a73b95 100644 --- a/server.js +++ b/server.js @@ -2783,12 +2783,15 @@ cache(function(data, match, sendBadge, request) { // CircleCI build integration. // https://circleci.com/api/v1/project/BrightFlair/PHP.Gt?circle-token=0a5143728784b263d9f0238b8d595522689b3af2&limit=1&filter=completed -camp.route(/^\/circleci\/project\/(.*)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/circleci\/project\/([^\/]+\/[^\/]+)\/(.*)\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var userRepo = match[1]; // eg, `doctrine/orm`. - var format = match[2]; + var branch = match[2]; + var format = match[3]; var apiUrl = 'https://circleci.com/api/v1/project/' + userRepo + + "/tree/" + + branch + '?circle-token=0a5143728784b263d9f0238b8d595522689b3af2' + '&limit=1&filter=completed'; var badgeData = getBadgeData('CircleCI', data); @@ -2799,18 +2802,31 @@ cache(function(data, match, sendBadge, request) { } try { var data = JSON.parse(buffer); - var unstable = function(ver) { return /dev/.test(ver); }; - // Grab the latest stable version, or an unstable - var version = data[0].branch; - badgeData.text[1] = version; - if (/^\d/.test(badgeData.text[1])) { - badgeData.text[1] = 'v' + version; - } - if (version[0] === '0' || /dev/.test(version)) { - badgeData.colorscheme = 'orange'; - } else { - badgeData.colorscheme = 'blue'; + var status = data[0].status; + switch(status) { + case 'success': + badgeData.colorscheme = 'brightgreen'; + badgeData.text[1] = 'passing'; + break; + + case 'failed': + badgeData.colorscheme = 'red'; + badgeData.text[1] = 'failed'; + break; + + case 'no_tests': + case 'scheduled': + case 'not_run': + badgeData.colorscheme = 'yellow'; + badgeData.text[1] = status.replace('_', ' '); + break; + + default: + badgeData.colorscheme = 'grey'; + badgeData.text[1] = status.replace('_', ' '); + break; } + sendBadge(format, badgeData); } catch(e) { badgeData.text[1] = 'invalid'; From 79f7c9732791e1b94f745bf9c550a0e6b12a42ef Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 15:53:32 +0000 Subject: [PATCH 03/11] Improve switch flow --- server.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server.js b/server.js index 6a73b95..ee3ee16 100644 --- a/server.js +++ b/server.js @@ -2818,11 +2818,7 @@ cache(function(data, match, sendBadge, request) { case 'scheduled': case 'not_run': badgeData.colorscheme = 'yellow'; - badgeData.text[1] = status.replace('_', ' '); - break; - default: - badgeData.colorscheme = 'grey'; badgeData.text[1] = status.replace('_', ' '); break; } From 4a6104d89a18b030c8076e0b9f15a3c7616404fb Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:03:31 +0000 Subject: [PATCH 04/11] Tidy badly formatted JSON --- server.js | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/server.js b/server.js index ee3ee16..fac98b2 100644 --- a/server.js +++ b/server.js @@ -2783,24 +2783,36 @@ cache(function(data, match, sendBadge, request) { // CircleCI build integration. // https://circleci.com/api/v1/project/BrightFlair/PHP.Gt?circle-token=0a5143728784b263d9f0238b8d595522689b3af2&limit=1&filter=completed -camp.route(/^\/circleci\/project\/([^\/]+\/[^\/]+)\/(.*)\.(svg|png|gif|jpg|json)$/, +camp.route(/^\/circleci\/project\/([^\/]+\/[^\/]+)(?:\/(.*))?\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { var userRepo = match[1]; // eg, `doctrine/orm`. var branch = match[2]; var format = match[3]; - var apiUrl = 'https://circleci.com/api/v1/project/' - + userRepo - + "/tree/" - + branch - + '?circle-token=0a5143728784b263d9f0238b8d595522689b3af2' + + var apiUrl = 'https://circleci.com/api/v1/project/' + userRepo; + if(branch != null) { + apiUrl += + "/tree/" + + branch; + } + apiUrl += + '?circle-token=0a5143728784b263d9f0238b8d595522689b3af2' + '&limit=1&filter=completed'; + var badgeData = getBadgeData('CircleCI', data); + request(apiUrl, function(err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; sendBadge(format, badgeData); } try { + // In case the request() implementation doesn't set the request header, + // we need to remove the first line of the response. + if(buffer.indexOf("//") === 0) { + buffer = buffer.substring(buffer.indexOf("\n")); + } + var data = JSON.parse(buffer); var status = data[0].status; switch(status) { From c00494eb13452a1ebb9ba1eb64a4b1888722bfdd Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:15:59 +0000 Subject: [PATCH 05/11] Output debug information --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index fac98b2..704bd23 100644 --- a/server.js +++ b/server.js @@ -2837,7 +2837,7 @@ cache(function(data, match, sendBadge, request) { sendBadge(format, badgeData); } catch(e) { - badgeData.text[1] = 'invalid'; + badgeData.text[1] = "Invalid: " + e.message;//'invalid'; sendBadge(format, badgeData); } }); From 643e59dac7b998ad36bc281033f7fa91488e0b8c Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:25:02 +0000 Subject: [PATCH 06/11] Update buffer trimming --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 704bd23..ef0b39e 100644 --- a/server.js +++ b/server.js @@ -2810,7 +2810,7 @@ cache(function(data, match, sendBadge, request) { // In case the request() implementation doesn't set the request header, // we need to remove the first line of the response. if(buffer.indexOf("//") === 0) { - buffer = buffer.substring(buffer.indexOf("\n")); + buffer = buffer.substring(buffer.indexOf("[")); } var data = JSON.parse(buffer); From aa708a36fd7e503105273c818bfa3a913187d2be Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:31:19 +0000 Subject: [PATCH 07/11] Update buffer trimming --- server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index ef0b39e..ebf23e0 100644 --- a/server.js +++ b/server.js @@ -2809,11 +2809,11 @@ cache(function(data, match, sendBadge, request) { try { // In case the request() implementation doesn't set the request header, // we need to remove the first line of the response. - if(buffer.indexOf("//") === 0) { - buffer = buffer.substring(buffer.indexOf("[")); + if(res.indexOf("//") < 2) { + res = res.substring(res.indexOf("[")); } - var data = JSON.parse(buffer); + var data = JSON.parse(res); var status = data[0].status; switch(status) { case 'success': From 60cb09496cbb0160fc463918bcf2e1e00e6b596a Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:34:22 +0000 Subject: [PATCH 08/11] Debug error --- server.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index ebf23e0..e1f3abc 100644 --- a/server.js +++ b/server.js @@ -2809,11 +2809,11 @@ cache(function(data, match, sendBadge, request) { try { // In case the request() implementation doesn't set the request header, // we need to remove the first line of the response. - if(res.indexOf("//") < 2) { - res = res.substring(res.indexOf("[")); + if(buffer.indexOf("//") < 2) { + buffer = buffer.substring(buffer.indexOf("[")); } - var data = JSON.parse(res); + var data = JSON.parse(buffer); var status = data[0].status; switch(status) { case 'success': @@ -2837,7 +2837,7 @@ cache(function(data, match, sendBadge, request) { sendBadge(format, badgeData); } catch(e) { - badgeData.text[1] = "Invalid: " + e.message;//'invalid'; + badgeData.text[1] = "ERROR: Buffer = " + buffer;//'invalid'; sendBadge(format, badgeData); } }); From 25202a8a22596099634a5dc5e309dc6043a0445a Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:54:30 +0000 Subject: [PATCH 09/11] Use JSON serialisation --- server.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/server.js b/server.js index e1f3abc..e665d15 100644 --- a/server.js +++ b/server.js @@ -2801,18 +2801,12 @@ cache(function(data, match, sendBadge, request) { var badgeData = getBadgeData('CircleCI', data); - request(apiUrl, function(err, res, buffer) { + request(apiUrl, {json:true}, function(err, res, buffer) { if (err != null) { badgeData.text[1] = 'inaccessible'; sendBadge(format, badgeData); } try { - // In case the request() implementation doesn't set the request header, - // we need to remove the first line of the response. - if(buffer.indexOf("//") < 2) { - buffer = buffer.substring(buffer.indexOf("[")); - } - var data = JSON.parse(buffer); var status = data[0].status; switch(status) { From 54de33b70c3023c7f1e97aa2ae1a2d83a4d7226d Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 16:58:04 +0000 Subject: [PATCH 10/11] Data already serialised --- server.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server.js b/server.js index e665d15..31541ff 100644 --- a/server.js +++ b/server.js @@ -2801,13 +2801,12 @@ cache(function(data, match, sendBadge, request) { var badgeData = getBadgeData('CircleCI', data); - request(apiUrl, {json:true}, function(err, res, buffer) { + request(apiUrl, {json:true}, function(err, res, data) { if (err != null) { badgeData.text[1] = 'inaccessible'; sendBadge(format, badgeData); } try { - var data = JSON.parse(buffer); var status = data[0].status; switch(status) { case 'success': From e7eebc1474f4a73e6e98c5c531b5d6ee3df0de34 Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Wed, 7 Jan 2015 17:16:39 +0000 Subject: [PATCH 11/11] Add docs & contrib notes --- try.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/try.html b/try.html index a857960..fcf7377 100644 --- a/try.html +++ b/try.html @@ -156,6 +156,14 @@ Pixel-perfect   Retina-ready   Fast   Consistent   Hackable https://img.shields.io/sensiolabs/i/45afb680-d4e6-4e66-93ea-bcfa79eb8a87.svg + CircleCI: + + https://img.shields.io/circleci/project/BrightFlair/PHP.Gt.svg + + CircleCI branch: + + https://img.shields.io/circleci/project/BrightFlair/PHP.Gt/master.svg +

Downloads

@@ -587,6 +595,9 @@ is where the current server got started. jublo + + g105b + sebmck