mirror of https://github.com/Seich/Beau.git
Moved all of the uppercase stuff into the code and out of the config.
This makes it easier to write the config file and makes everything easier to reason about on the code.
This commit is contained in:
parent
5a1f42827f
commit
fde0fc6543
|
|
@ -4,21 +4,21 @@ const yaml = require('js-yaml');
|
||||||
|
|
||||||
describe(`Beau's config Loader.`, () => {
|
describe(`Beau's config Loader.`, () => {
|
||||||
it ('Should only load valid configuration keys', () => {
|
it ('Should only load valid configuration keys', () => {
|
||||||
let HOST = 'http:/martianwabbit.com';
|
let host = 'http://martianwabbit.com';
|
||||||
let VERSION = 2;
|
let version = 1;
|
||||||
let CACHE = false;
|
let cache = false;
|
||||||
let shouldntBeAdded = true;
|
let shouldntBeAdded = true;
|
||||||
|
|
||||||
let beau = new Beau({
|
let beau = new Beau({
|
||||||
VERSION,
|
version,
|
||||||
HOST,
|
host,
|
||||||
CACHE,
|
cache,
|
||||||
shouldntBeAdded
|
shouldntBeAdded
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(beau.config.HOST).toBe(HOST);
|
expect(beau.config.HOST).toBe(host);
|
||||||
expect(beau.config.CACHE).toBe(CACHE);
|
expect(beau.config.CACHE).toBe(cache);
|
||||||
expect(beau.config.VERSION).toBe(VERSION);
|
expect(beau.config.VERSION).toBe(version);
|
||||||
expect(beau.config.shouldntBeAdded).toBeUndefined();
|
expect(beau.config.shouldntBeAdded).toBeUndefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,15 @@ describe('Request', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
req = {
|
req = {
|
||||||
request: 'POST /user',
|
request: 'POST /user',
|
||||||
HOST: 'http://martianwabbit.com',
|
host: 'http://martianwabbit.com',
|
||||||
PARAMS: {
|
alias: 'profile',
|
||||||
|
params: {
|
||||||
userId: '$profile.UserId'
|
userId: '$profile.UserId'
|
||||||
},
|
},
|
||||||
HEADERS: {
|
headers: {
|
||||||
authentication: 'BEARER $session.token'
|
authentication: 'BEARER $session.token'
|
||||||
},
|
},
|
||||||
PAYLOAD: {
|
payload: {
|
||||||
username: 'seich'
|
username: 'seich'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -30,16 +31,16 @@ describe('Request', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('It should load up the given request', () => {
|
test('It should load up the given request', () => {
|
||||||
expect(request.$verb).toBe('POST');
|
expect(request.VERB).toBe('POST');
|
||||||
expect(request.$endpoint).toBe(req.HOST + '/user');
|
expect(request.ENDPOINT).toBe(req.host + '/user');
|
||||||
expect(request.$headers).toBeDefined();
|
expect(request.HEADERS).toBeDefined();
|
||||||
expect(request.$payload).toBeDefined();
|
expect(request.PAYLOAD).toBeDefined();
|
||||||
expect(request.$params).toBeDefined();
|
expect(request.PARAMS).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('It should list all of its dependencies', () => {
|
test('It should list all of its dependencies', () => {
|
||||||
expect(request.$dependencies.size).toBe(2);
|
expect(request.DEPENDENCIES.size).toBe(2);
|
||||||
expect(request.$dependencies).toContain('$session');
|
expect(request.DEPENDENCIES).toContain('$session');
|
||||||
expect(request.$dependencies).toContain('$profile');
|
expect(request.DEPENDENCIES).toContain('$profile');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ describe('RequestList', () => {
|
||||||
'POST /session': null,
|
'POST /session': null,
|
||||||
'Not a Request': null,
|
'Not a Request': null,
|
||||||
'POST /user': {
|
'POST /user': {
|
||||||
ALIAS: '$user',
|
alias: 'user',
|
||||||
PAYLOAD: {
|
payload: {
|
||||||
name: 'Sergio',
|
name: 'Sergio',
|
||||||
lastname: 'Diaz'
|
lastname: 'Diaz'
|
||||||
}
|
}
|
||||||
|
|
@ -20,7 +20,7 @@ describe('RequestList', () => {
|
||||||
let request = requests.list[0];
|
let request = requests.list[0];
|
||||||
|
|
||||||
expect(requests.list.length).toBe(2);
|
expect(requests.list.length).toBe(2);
|
||||||
expect(request.$verb).toBe('POST');
|
expect(request.VERB).toBe('POST');
|
||||||
expect(request.$endpoint).toBe(host + '/session');
|
expect(request.ENDPOINT).toBe(host + '/session');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
13
bin/beau
13
bin/beau
|
|
@ -37,11 +37,11 @@ if (program.list) {
|
||||||
.column('Endpoint', 20, [clc.cyan])
|
.column('Endpoint', 20, [clc.cyan])
|
||||||
.output();
|
.output();
|
||||||
|
|
||||||
beau.requests.list.forEach(({$verb, $alias, $endpoint}) =>
|
beau.requests.list.forEach(({VERB, ALIAS, ENDPOINT}) =>
|
||||||
new Line().padding(2)
|
new Line().padding(2)
|
||||||
.column($verb, 20, [clc.yellow])
|
.column(VERB, 20, [clc.yellow])
|
||||||
.column($alias, 30, [clc.yellow])
|
.column(ALIAS, 30, [clc.yellow])
|
||||||
.column($endpoint)
|
.column(ENDPOINT)
|
||||||
.output()
|
.output()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -49,13 +49,12 @@ if (program.list) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (program.request) {
|
if (program.request) {
|
||||||
const request = `$${program.request}`;
|
const spinner = new Spinner(clc.yellow(`Requesting: ${program.request}`));
|
||||||
const spinner = new Spinner(clc.yellow(`Requesting: ${request}`));
|
|
||||||
|
|
||||||
spinner.start();
|
spinner.start();
|
||||||
|
|
||||||
beau.requests
|
beau.requests
|
||||||
.execByAlias(request)
|
.execByAlias(program.request)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
spinner.stop();
|
spinner.stop();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
version: 1
|
||||||
|
host: 'https://jsonplaceholder.typicode.com'
|
||||||
|
|
||||||
|
GET /posts/:
|
||||||
|
alias: posts
|
||||||
|
|
||||||
|
POST /posts/:
|
||||||
|
alias: new-post
|
||||||
|
|
||||||
|
GET /users/$posts.response.body.0.userId:
|
||||||
|
alias: post-user
|
||||||
|
|
@ -2,27 +2,27 @@ VERSION: '1'
|
||||||
HOST: https://slack.com/api
|
HOST: https://slack.com/api
|
||||||
|
|
||||||
auth: &auth
|
auth: &auth
|
||||||
token: xoxp-139455775026-139455775090-140286212801-4a786b8b600db898df76302a0bf0784c
|
token: xoxp-139455775026-139455775090-147751461120-f224ed6ffee029869a0f138d0859e7d6
|
||||||
|
|
||||||
GET /users.getPresence:
|
GET /users.getPresence:
|
||||||
ALIAS: $presence
|
ALIAS: presence
|
||||||
PARAMS:
|
PARAMS:
|
||||||
<<: *auth
|
<<: *auth
|
||||||
|
|
||||||
GET /channels.list:
|
GET /channels.list:
|
||||||
ALIAS: $channel-list
|
ALIAS: channel-list
|
||||||
PARAMS:
|
PARAMS:
|
||||||
<<: *auth
|
<<: *auth
|
||||||
exclude_archived: true
|
exclude_archived: true
|
||||||
|
|
||||||
GET /channels.info:
|
GET /channels.info:
|
||||||
ALIAS: $channel-info
|
ALIAS: channel-info
|
||||||
PARAMS:
|
PARAMS:
|
||||||
<<: *auth
|
<<: *auth
|
||||||
channel: $channel-list.response.body.channels.0.id
|
channel: $channel-list.response.body.channels.0.id
|
||||||
|
|
||||||
POST /chat.postMessage:
|
POST /chat.postMessage:
|
||||||
ALIAS: $new-message
|
ALIAS: new-message
|
||||||
PARAMS:
|
PARAMS:
|
||||||
<<: *auth
|
<<: *auth
|
||||||
channel: $channel-info.response.body.channel.id
|
channel: $channel-info.response.body.channel.id
|
||||||
|
|
@ -32,6 +32,6 @@ POST /chat.postMessage:
|
||||||
username: Beau
|
username: Beau
|
||||||
|
|
||||||
GET /users.list:
|
GET /users.list:
|
||||||
ALIAS: $user-list
|
ALIAS: user-list
|
||||||
PARAMS:
|
PARAMS:
|
||||||
<<: *auth
|
<<: *auth
|
||||||
|
|
|
||||||
41
request.js
41
request.js
|
|
@ -5,18 +5,23 @@ const RequestCache = require('./requestCache');
|
||||||
|
|
||||||
class Request {
|
class Request {
|
||||||
constructor(req, list) {
|
constructor(req, list) {
|
||||||
let { request, ALIAS, PAYLOAD, HOST, PARAMS, HEADERS } = req;
|
|
||||||
let { verb, endpoint } = this.parseRequest(request);
|
|
||||||
|
|
||||||
this.$verb = verb;
|
let config = {};
|
||||||
this.$endpoint = HOST + endpoint;
|
|
||||||
|
|
||||||
this.$headers = HEADERS;
|
Object.keys(req).forEach(k => config[k.toUpperCase()] = req[k]);
|
||||||
this.$payload = PAYLOAD;
|
|
||||||
this.$params = PARAMS;
|
|
||||||
|
|
||||||
this.$alias = ALIAS;
|
let { REQUEST, ALIAS, PAYLOAD, HOST, PARAMS, HEADERS } = config;
|
||||||
this.$dependencies = this.findDependencies(req);
|
let { verb, endpoint } = this.parseRequest(REQUEST);
|
||||||
|
|
||||||
|
this.VERB = verb;
|
||||||
|
this.ENDPOINT = HOST + endpoint;
|
||||||
|
|
||||||
|
this.HEADERS = HEADERS;
|
||||||
|
this.PAYLOAD = PAYLOAD;
|
||||||
|
this.PARAMS = PARAMS;
|
||||||
|
|
||||||
|
this.ALIAS = ALIAS;
|
||||||
|
this.DEPENDENCIES = this.findDependencies(req);
|
||||||
|
|
||||||
this.list = list;
|
this.list = list;
|
||||||
}
|
}
|
||||||
|
|
@ -33,14 +38,14 @@ class Request {
|
||||||
findDependencies(request, set = new Set()) {
|
findDependencies(request, set = new Set()) {
|
||||||
if (typeof request === 'object') {
|
if (typeof request === 'object') {
|
||||||
Object.keys(request).forEach(key => {
|
Object.keys(request).forEach(key => {
|
||||||
if (key === 'ALIAS' || key.startsWith('$'))
|
if (key === 'ALIAS')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
set = this.findDependencies(request[key], set);
|
set = this.findDependencies(request[key], set);
|
||||||
});
|
});
|
||||||
} else if (typeof request === 'string') {
|
} else if (typeof request === 'string') {
|
||||||
let matches = request.match(replacementRegex) || [];
|
let matches = request.match(replacementRegex) || [];
|
||||||
let deps = matches.map(m => m.split('.')[0]);
|
let deps = matches.map(m => m.split('.')[0].substring(1));
|
||||||
|
|
||||||
return new Set([...set, ...deps]);
|
return new Set([...set, ...deps]);
|
||||||
}
|
}
|
||||||
|
|
@ -49,15 +54,15 @@ class Request {
|
||||||
}
|
}
|
||||||
|
|
||||||
exec() {
|
exec() {
|
||||||
let dependencies = Array.from(this.$dependencies);
|
let dependencies = Array.from(this.DEPENDENCIES);
|
||||||
|
|
||||||
return this.list.fetchDependencies(dependencies).then(cache => {
|
return this.list.fetchDependencies(dependencies).then(cache => {
|
||||||
let endpoint = cache.parse(this.$endpoint);
|
let endpoint = cache.parse(this.ENDPOINT);
|
||||||
let request = unirest(this.$verb, endpoint);
|
let request = unirest(this.VERB, endpoint);
|
||||||
|
|
||||||
request.headers(cache.parse(this.$headers));
|
request.headers(cache.parse(this.HEADERS));
|
||||||
request.query(cache.parse(this.$params));
|
request.query(cache.parse(this.PARAMS));
|
||||||
request.send(cache.parse(this.$payload));
|
request.send(cache.parse(this.PAYLOAD));
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
request.end(res => {
|
request.end(res => {
|
||||||
|
|
@ -74,7 +79,7 @@ class Request {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
cache.add(this.$alias, results);
|
cache.add(`$${this.ALIAS}`, results);
|
||||||
|
|
||||||
resolve(results);
|
resolve(results);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ class RequestList {
|
||||||
}
|
}
|
||||||
|
|
||||||
execByAlias(alias) {
|
execByAlias(alias) {
|
||||||
let request = this.list.find(r => r.$alias === alias);
|
let request = this.list.find(r => r.ALIAS === alias);
|
||||||
|
|
||||||
if (typeof request === 'undefined') {
|
if (typeof request === 'undefined') {
|
||||||
return Promise.reject(`${alias} not found among the requests.`);
|
return Promise.reject(`${alias} not found among the requests.`);
|
||||||
|
|
@ -20,7 +20,7 @@ class RequestList {
|
||||||
.exec()
|
.exec()
|
||||||
.catch(reason => {
|
.catch(reason => {
|
||||||
return Promise
|
return Promise
|
||||||
.reject(`${request.$verb} ${request.$endpoint} FAILED. \nDependencies not met:\n${reason}`);
|
.reject(`${request.VERB} ${request.ENDPOINT} FAILED. \nDependencies not met:\n${reason}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
const httpVerbs = ['POST', 'GET', 'PUT', 'PATCH', 'DELETE'];
|
const httpVerbs = ['POST', 'GET', 'PUT', 'PATCH', 'DELETE'];
|
||||||
const requestRegex = new RegExp(`(${httpVerbs.join('|')})\\s(.*)`, 'i');
|
const requestRegex = new RegExp(`(${httpVerbs.join('|')})\\s(.*)`, 'i');
|
||||||
const replacementRegex = /(\$[a-zA-Z\.\d\-\_]*)/g;
|
const replacementRegex = /\$([a-zA-Z\.\d\-\_]*)/g;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
httpVerbs,
|
httpVerbs,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue