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.
This commit is contained in:
David Diaz 2018-05-22 15:57:48 -06:00
parent d502f1dd01
commit aa0b937582
6 changed files with 79 additions and 79 deletions

View File

@ -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);
});
});

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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',

49
bin/cli/utils.js Normal file
View File

@ -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
};