From aa0b937582f18d5a7e1440b7f627c764b0130eee Mon Sep 17 00:00:00 2001 From: David Diaz Date: Tue, 22 May 2018 15:57:48 -0600 Subject: [PATCH] Got rid of the base class, it complicated testing. Now it lives on as a utils file. Should make it easier to test the CLI. --- bin/__tests__/list.spec.js | 11 +++++++ bin/cli/base.js | 57 ------------------------------------ bin/cli/commands/list.js | 11 ++++--- bin/cli/commands/request.js | 16 +++++----- bin/cli/commands/validate.js | 14 ++++----- bin/cli/utils.js | 49 +++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 79 deletions(-) create mode 100644 bin/__tests__/list.spec.js delete mode 100644 bin/cli/base.js create mode 100644 bin/cli/utils.js diff --git a/bin/__tests__/list.spec.js b/bin/__tests__/list.spec.js new file mode 100644 index 0000000..96d059e --- /dev/null +++ b/bin/__tests__/list.spec.js @@ -0,0 +1,11 @@ +const { test, expect } = require('@oclif/test'); +const Nock = require('@fancy-test/nock'); + +const Test = test.register('nock', Nock); + +describe('List Command', () => { + let a = Test.stdout().command(['list', '-c', 'hello.yml']); + a.it('tst', ctx => { + console.log(ctx); + }); +}); diff --git a/bin/cli/base.js b/bin/cli/base.js deleted file mode 100644 index bb8e286..0000000 --- a/bin/cli/base.js +++ /dev/null @@ -1,57 +0,0 @@ -const yaml = require('js-yaml'); -const fs = require('fs'); -const path = require('path'); -const dotenv = require('dotenv'); -const { Command, flags } = require('@oclif/command'); -const { Spinner } = require('clui'); - -const Beau = require('../../src/beau'); - -class Base extends Command { - async init() { - const spinnerSprite = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷']; - this.spinner = new Spinner('', spinnerSprite); - } - - openConfigFile(configFile) { - if (!fs.existsSync(configFile)) { - this.error(`The config file, ${configFile} was not found.`); - this.exit(1); - } - - return yaml.safeLoad(fs.readFileSync(configFile, 'utf-8')); - } - - loadConfig(configFile, params = []) { - const config = this.openConfigFile(configFile); - const env = dotenv.config().parsed || {}; - params = dotenv.parse(params.reduce((a, p) => a + '\n' + p, '')); - - const envParams = { _: Object.assign(env, params) }; - - const configFileDir = path.dirname( - path.resolve(process.cwd(), configFile) - ); - - process.chdir(configFileDir); - - return new Beau(config, envParams); - } -} - -Base.flags = { - config: flags.string({ - char: 'c', - description: 'The configuration file to be used.', - default: 'beau.yml' - }), - verbose: flags.boolean({ - char: 'V', - description: `Show all additional information available for a command.` - }), - 'no-format': flags.boolean({ - description: `Disables color formatting for usage on external tools.` - }) -}; - -module.exports = Base; diff --git a/bin/cli/commands/list.js b/bin/cli/commands/list.js index ba65234..388df4d 100644 --- a/bin/cli/commands/list.js +++ b/bin/cli/commands/list.js @@ -1,13 +1,12 @@ const clc = require('cli-color'); const { Line } = require('clui'); -const { flags } = require('@oclif/command'); +const { flags, Command } = require('@oclif/command'); +const { baseFlags, loadConfig } = require('../utils'); -const Base = require('../base'); - -class ListCommand extends Base { +class ListCommand extends Command { async run() { const { flags } = this.parse(ListCommand); - const Beau = this.loadConfig(flags.config); + const Beau = loadConfig(flags.config); if (flags['no-format']) { return Beau.requests.list.forEach( @@ -47,6 +46,6 @@ class ListCommand extends Base { } ListCommand.description = `Lists all available requests in the config file.`; -ListCommand.flags = { ...Base.flags }; +ListCommand.flags = { ...baseFlags }; module.exports = ListCommand; diff --git a/bin/cli/commands/request.js b/bin/cli/commands/request.js index 3493cf3..e403073 100644 --- a/bin/cli/commands/request.js +++ b/bin/cli/commands/request.js @@ -1,11 +1,10 @@ const clc = require('cli-color'); const jsome = require('jsome'); -const { Line } = require('clui'); -const { flags } = require('@oclif/command'); +const { Line, Spinner } = require('clui'); +const { flags, Command } = require('@oclif/command'); +const { baseFlags, loadConfig } = require('../utils'); -const Base = require('../base'); - -class RequestCommand extends Base { +class RequestCommand extends Command { prettyOutput(res, verbose = false) { let { status, body } = res.response; @@ -45,7 +44,10 @@ class RequestCommand extends Base { args } = this.parse(RequestCommand); - const Beau = this.loadConfig(config, params); + const Beau = loadConfig(config, params); + + const spinnerSprite = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷']; + this.spinner = new Spinner('', spinnerSprite); let spinnerEnabled = !noFormat && !asJson && !quiet; @@ -89,7 +91,7 @@ class RequestCommand extends Base { RequestCommand.description = `Executes a request by name.`; RequestCommand.flags = { - ...Base.flags, + ...baseFlags, param: flags.string({ char: 'P', multiple: true, diff --git a/bin/cli/commands/validate.js b/bin/cli/commands/validate.js index a69b8ae..311ad7b 100644 --- a/bin/cli/commands/validate.js +++ b/bin/cli/commands/validate.js @@ -1,17 +1,13 @@ -const clc = require('cli-color'); -const fs = require('fs'); -const yaml = require('js-yaml'); -const { flags } = require('@oclif/command'); - -const Base = require('../base'); +const { flags, Command } = require('@oclif/command'); +const { baseFlags, openConfigFile } = require('../utils'); const { validate } = require('../../../src/schema.js'); -class ValidateCommand extends Base { +class ValidateCommand extends Command { async run() { const { flags, args } = this.parse(ValidateCommand); const configFile = args.alias || flags.config; - const config = this.openConfigFile(configFile); + const config = openConfigFile(configFile); let result = await validate(config); if (result.valid) { @@ -23,7 +19,7 @@ class ValidateCommand extends Base { } ValidateCommand.description = `Validates the given configuration file against Beau's configuration schema.`; -ValidateCommand.flags = { ...Base.flags }; +ValidateCommand.flags = { ...baseFlags }; ValidateCommand.args = [ { name: 'alias', diff --git a/bin/cli/utils.js b/bin/cli/utils.js new file mode 100644 index 0000000..fd3df10 --- /dev/null +++ b/bin/cli/utils.js @@ -0,0 +1,49 @@ +const yaml = require('js-yaml'); +const fs = require('fs'); +const path = require('path'); +const dotenv = require('dotenv'); +const Beau = require('../../src/beau'); +const { flags } = require('@oclif/command'); + +const openConfigFile = configFile => { + if (!fs.existsSync(configFile)) { + throw new Error(`The config file, ${configFile} was not found.`); + } + + return yaml.safeLoad(fs.readFileSync(configFile, 'utf-8')); +}; + +const loadConfig = (configFile, params = []) => { + const config = openConfigFile(configFile); + const env = dotenv.config().parsed || {}; + params = dotenv.parse(params.reduce((a, p) => a + '\n' + p, '')); + + const envParams = { _: Object.assign(env, params) }; + + const configFileDir = path.dirname(path.resolve(process.cwd(), configFile)); + + process.chdir(configFileDir); + + return new Beau(config, envParams); +}; + +const baseFlags = { + config: flags.string({ + char: 'c', + description: 'The configuration file to be used.', + default: 'beau.yml' + }), + verbose: flags.boolean({ + char: 'V', + description: `Show all additional information available for a command.` + }), + 'no-format': flags.boolean({ + description: `Disables color formatting for usage on external tools.` + }) +}; + +module.exports = { + openConfigFile, + loadConfig, + baseFlags +};