You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by al...@apache.org on 2020/04/18 07:18:18 UTC
[openwhisk-wskdebug] 01/03: wip: better console output using
spinners
This is an automated email from the ASF dual-hosted git repository.
alexkli pushed a commit to branch console-spinner
in repository https://gitbox.apache.org/repos/asf/openwhisk-wskdebug.git
commit ec7f1000834cd54cf43d90a2556e3948217c672d
Author: Alexander Klimetschek <ak...@adobe.com>
AuthorDate: Tue Apr 14 17:05:59 2020 -0700
wip: better console output using spinners
---
package-lock.json | 98 +++++++++++++++++++++++++++++++++++++++++++------------
package.json | 1 +
src/debugger.js | 25 +++++++++++---
src/invoker.js | 5 ++-
src/watcher.js | 5 ++-
5 files changed, 108 insertions(+), 26 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index ce21bad..c256a42 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -489,7 +489,6 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@@ -500,7 +499,6 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
"requires": {
"color-convert": "^1.9.0"
}
@@ -509,7 +507,6 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
"requires": {
"color-name": "1.1.3"
}
@@ -517,8 +514,7 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
}
}
},
@@ -559,11 +555,15 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
"integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
"requires": {
"restore-cursor": "^3.1.0"
}
},
+ "cli-spinners": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
+ "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w=="
+ },
"cli-width": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
@@ -681,6 +681,21 @@
"strip-bom": "^4.0.0"
}
},
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "requires": {
+ "clone": "^1.0.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ }
+ }
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -762,8 +777,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
"version": "6.8.0",
@@ -1227,8 +1241,7 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-symbols": {
"version": "1.0.1",
@@ -1468,6 +1481,11 @@
"is-extglob": "^2.1.1"
}
},
+ "is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
+ },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -1799,7 +1817,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
"integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
"requires": {
"chalk": "^2.4.2"
}
@@ -1821,8 +1838,7 @@
"mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
},
"minimatch": {
"version": "3.0.4",
@@ -2162,8 +2178,7 @@
"mute-stream": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
},
"natural-compare": {
"version": "1.4.0",
@@ -2359,7 +2374,6 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
"integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "dev": true,
"requires": {
"mimic-fn": "^2.1.0"
}
@@ -2391,6 +2405,45 @@
"resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz",
"integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA=="
},
+ "ora": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz",
+ "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==",
+ "requires": {
+ "chalk": "^3.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.2.0",
+ "is-interactive": "^1.0.0",
+ "log-symbols": "^3.0.0",
+ "mute-stream": "0.0.8",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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"
+ }
+ }
+ }
+ },
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -2600,7 +2653,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
"requires": {
"onetime": "^5.1.0",
"signal-exit": "^3.0.2"
@@ -2678,8 +2730,7 @@
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
- "dev": true
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
},
"slice-ansi": {
"version": "2.1.0",
@@ -2861,7 +2912,6 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
"requires": {
"has-flag": "^3.0.0"
}
@@ -3047,6 +3097,14 @@
"integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
"dev": true
},
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
"whatwg-fetch": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
diff --git a/package.json b/package.json
index 27004d0..b75166c 100644
--- a/package.json
+++ b/package.json
@@ -50,6 +50,7 @@
"livereload": "^0.9.1",
"manakin": "^0.5.2",
"openwhisk": "^3.21.1",
+ "ora": "^4.0.3",
"pretty-bytes": "^5.3.0",
"pretty-ms": "^6.0.1",
"yargs": "^15.3.1"
diff --git a/src/debugger.js b/src/debugger.js
index 879d497..9f1e40d 100644
--- a/src/debugger.js
+++ b/src/debugger.js
@@ -27,6 +27,7 @@ const sleep = require('util').promisify(setTimeout);
const debug = require('./debug');
const prettyBytes = require('pretty-bytes');
const prettyMilliseconds = require('pretty-ms');
+const ora = require('ora');
/**
* Central component of wskdebug.
@@ -54,25 +55,35 @@ class Debugger {
console.error(`Error: Could not setup openwhisk client: ${err.message}`);
process.exit(1);
}
+ this.spinner = ora({color: "blue"});
+ if (debug.enabled) {
+ // disable spinner from outputting anything since we have all the debug() logs
+ this.spinner.start = () => {};
+ this.spinner.stop = () => {};
+ }
+ this.spinner.start(`Starting`);
}
async start() {
this.agentMgr = new AgentMgr(this.argv, this.wsk, this.actionName);
- this.watcher = new Watcher(this.argv, this.wsk);
+ this.watcher = new Watcher(this.argv, this.wsk, this.spinner);
+ this.spinner.start(`Inspecting action`);
// get the action metadata
const actionMetadata = await this.agentMgr.peekAction();
debug("fetched action metadata from openwhisk");
-
this.wskProps.namespace = actionMetadata.namespace;
- console.info(`Starting debugger for /${this.wskProps.namespace}/${this.actionName}`);
+
+ this.spinner.stop();
+ console.info(`Debugging /${this.wskProps.namespace}/${this.actionName}`);
// local debug container
- this.invoker = new OpenWhiskInvoker(this.actionName, actionMetadata, this.argv, this.wskProps, this.wsk);
+ this.invoker = new OpenWhiskInvoker(this.actionName, actionMetadata, this.argv, this.wskProps, this.wsk, this.spinner);
try {
// run build initially (would be required by starting container)
if (this.argv.onBuild) {
+ this.spinner.stop();
console.info("=> Build:", this.argv.onBuild);
spawnSync(this.argv.onBuild, {shell: true, stdio: "inherit"});
}
@@ -83,6 +94,7 @@ class Debugger {
// task 1 - start local container
const containerTask = (async () => {
const debugTask = debug.task();
+ this.spinner.start('Starting local container');
// start container - get it up fast for VSCode to connect within its 10 seconds timeout
await this.invoker.startContainer();
@@ -103,6 +115,8 @@ class Debugger {
const results = await Promise.all([containerTask, openwhiskTask]);
const actionWithCode = results[1];
+ this.spinner.start('Installing agent');
+
// parallelize slower work using promises again
// task 3 - initialize local container with code
@@ -126,6 +140,7 @@ class Debugger {
await Promise.all([initTask, agentTask]);
if (this.argv.onStart) {
+ this.spinner.stop();
console.log("On start:", this.argv.onStart);
spawnSync(this.argv.onStart, {shell: true, stdio: "inherit"});
}
@@ -133,6 +148,8 @@ class Debugger {
// start source watching (live reload) if requested
await this.watcher.start();
+ this.spinner.stop();
+
console.log();
console.info(`Action : /${this.wskProps.namespace}/${this.actionName}`);
if (this.sourcePath) {
diff --git a/src/invoker.js b/src/invoker.js
index eed849a..98bb1d3 100644
--- a/src/invoker.js
+++ b/src/invoker.js
@@ -55,7 +55,7 @@ function resolveValue(value, ...args) {
}
class OpenWhiskInvoker {
- constructor(actionName, action, options, wskProps, wsk) {
+ constructor(actionName, action, options, wskProps, wsk, spinner) {
this.actionName = actionName;
this.action = action;
@@ -80,6 +80,8 @@ class OpenWhiskInvoker {
this.wskProps = wskProps;
this.wsk = wsk;
+ this.spinner = spinner;
+
this.containerName = this.asContainerName(`wskdebug-${this.action.name}-${Date.now()}`);
}
@@ -237,6 +239,7 @@ class OpenWhiskInvoker {
this.containerRunning = true;
+ this.spinner.stop();
spawn("docker", ["logs", "-t", "-f", this.name()], {
stdio: [
"inherit", // stdin
diff --git a/src/watcher.js b/src/watcher.js
index dcea5a6..dba16a3 100644
--- a/src/watcher.js
+++ b/src/watcher.js
@@ -23,9 +23,10 @@ const { spawnSync } = require('child_process');
const debug = require('./debug');
class Watcher {
- constructor(argv, wsk) {
+ constructor(argv, wsk, spinner) {
this.argv = argv;
this.wsk = wsk;
+ this.spinner = spinner;
}
async start() {
@@ -38,6 +39,8 @@ class Watcher {
|| this.argv.invokeParams
|| this.argv.invokeAction )
) {
+ this.spinner.start('Initializing source watching');
+
this.liveReloadServer = livereload.createServer({
port: this.argv.livereloadPort,
noListen: !this.argv.livereload,