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,