diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3f2817f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM node:12 + +COPY . . diff --git a/action.js b/action.js new file mode 100644 index 0000000..88e52b9 --- /dev/null +++ b/action.js @@ -0,0 +1,60 @@ +'use strict' + +const fs = require('fs') +const yaml = require('yaml') + +const formatters = { + txt: txtFormatter, + json: jsonFormatter, + shell: (data) => txtFormatter(data, { colors: true}), +} + +main() + +function main() { + const format = process.argv[2] + + const formatter = formatters[format] + if (!formatter) { + invalidFormat(format) + return + } + + const data = yaml.parse(fs.readFileSync("./humans.txt.yaml", {encoding: "utf8"})) + + formatter(data) +} + +function invalidFormat(format) { + const list = Object.keys(formatters).sort().join(",") + console.error(`'${format}' is not one of the accepted formats ${list}`) + process.statusCode = 1 + return +} + +function jsonFormatter({humans}) { + console.log(JSON.stringify(humans, null, 4)) +} + +function txtFormatter({humans}, {colors = false} = {}) { + let active = humans.filter(h => !h.alum).map(h => h.name) + let alum = humans.filter(h => h.alum).map(h => h.name) + + if(colors) { + const chalk = require('chalk') + const total = active.length + alum.length + active = active.map((n, i) => chalk.hsl((i / total) * 360, 100, 50)(n)) + alum = alum.map((n, i) => chalk.hsl(((i + active.length) / total) * 360, 100, 50)(n)) + } + + console.log("Current humans") + console.log("==============\n") + console.log(active.join("\n")) + console.log("\n") + + console.log("Human alumni") + console.log("============\n") + console.log(alum.join("\n")) +} + + diff --git a/actions.test.js b/actions.test.js new file mode 100644 index 0000000..b25c065 --- /dev/null +++ b/actions.test.js @@ -0,0 +1,2 @@ +const assert = require('assert') + diff --git a/actions.yml b/actions.yml new file mode 100644 index 0000000..229990a --- /dev/null +++ b/actions.yml @@ -0,0 +1,11 @@ +name: 'GitHub Actions humans.txt' +description: 'List out the humans who help feed and tend the robots of GitHub Actions' +inputs: + format: + description: 'How to output the people of actions - txt, json or ascii' + default: 'ascii' +runs: + using: 'docker' + image: 'Dockerfile' + args: + - ${{ inputs.format }} diff --git a/humans.txt.yaml b/humans.txt.yaml new file mode 100644 index 0000000..a08ed76 --- /dev/null +++ b/humans.txt.yaml @@ -0,0 +1,2 @@ +humans: + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..62d2acb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,76 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", + "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "ansi-styles": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", + "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yaml": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", + "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "requires": { + "@babel/runtime": "^7.6.3" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..afa6d5f --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "dependencies": { + "chalk": "3.0.0", + "yaml": "1.7.2" + } +} diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..9eec1de --- /dev/null +++ b/test.sh @@ -0,0 +1,8 @@ +#!bin/bash + +set -xeuo pipefail + +node action.js txt >/tmp/t1 +node action.js json >/tmp/t2 +node action.js shell >/tmp/t3 +