diff --git a/endpoints/coveralls.ts b/endpoints/coveralls.ts new file mode 100644 index 0000000..b789406 --- /dev/null +++ b/endpoints/coveralls.ts @@ -0,0 +1,51 @@ +import got from '../libs/got' +import { coverage as cov, coverageColor } from '../libs/utils' +import { + badgenServe, + BadgenServeMeta as Meta, + BadgenServeHandlers as Handlers, + BadgenServeHandlerArgs as Args +} from '../libs/badgen-serve' + +export const meta: Meta = { + title: 'Coveralls', + examples: { + '/coveralls/c/github/jekyll/jekyll': 'coverage (github)', + '/coveralls/c/github/jekyll/jekyll/master': 'coverage (github, branch)', + '/coveralls/c/bitbucket/pyKLIP/pyklip': 'coverage (bitbucket)', + '/coveralls/c/bitbucket/pyKLIP/pyklip/master': 'coverage (bitbucket, branch)', + } +} + +export const handlers: Handlers = { + '/coveralls/c/:vcs/:owner/:repo/:branch?': handler +} + +export default badgenServe(handlers) + +// Detect coveralls.io's badge redirection instead of using it's api +// See https://github.com/badgen/badgen.net/issues/96 +async function handler ({ vcs, owner, repo, branch }: Args) { + const endpoint = `https://coveralls.io/repos/${vcs}/${owner}/${repo}/badge.svg` + const badgeURL = await got.head(endpoint, { + // @ts-ignore + json: false, + query: { branch }, + followRedirect: false // Expecting 302 redirection to "coveralls_xxx.svg" + }).then(res => res.headers.location) + + try { + const percentage = badgeURL.match(/_(\d+)\.svg/)[1] + return { + subject: 'coverage', + status: cov(percentage), + color: coverageColor(Number(percentage)) + } + } catch (e) { + return { + subject: 'coverage', + status: 'invalid', + color: 'grey' + } + } +} diff --git a/libs/examples.ts b/libs/examples.ts index 593bbe9..51cbfa8 100644 --- a/libs/examples.ts +++ b/libs/examples.ts @@ -29,6 +29,7 @@ const liveBadgeExampleList = [ 'circleci', 'appveyor', 'codecov', + 'coveralls', // quality & metrics // utilities ]