From fde0fc654321a41b8cacb44134ba36fedd39195c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20D=C3=ADaz?= Date: Tue, 7 Mar 2017 18:01:11 -0600 Subject: [PATCH] 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. --- __tests__/beau.spec.js | 18 +++++++-------- __tests__/request.spec.js | 25 +++++++++++---------- __tests__/requestList.spec.js | 8 +++---- bin/beau | 13 +++++------ examples/jsonplaceholer.yml | 11 ++++++++++ examples/slack.yml | 12 +++++----- request.js | 41 ++++++++++++++++++++--------------- requestList.js | 4 ++-- shared.js | 2 +- 9 files changed, 75 insertions(+), 59 deletions(-) create mode 100644 examples/jsonplaceholer.yml diff --git a/__tests__/beau.spec.js b/__tests__/beau.spec.js index 295d564..929ba56 100644 --- a/__tests__/beau.spec.js +++ b/__tests__/beau.spec.js @@ -4,21 +4,21 @@ const yaml = require('js-yaml'); describe(`Beau's config Loader.`, () => { it ('Should only load valid configuration keys', () => { - let HOST = 'http:/martianwabbit.com'; - let VERSION = 2; - let CACHE = false; + let host = 'http://martianwabbit.com'; + let version = 1; + let cache = false; let shouldntBeAdded = true; let beau = new Beau({ - VERSION, - HOST, - CACHE, + version, + host, + cache, shouldntBeAdded }); - expect(beau.config.HOST).toBe(HOST); - expect(beau.config.CACHE).toBe(CACHE); - expect(beau.config.VERSION).toBe(VERSION); + expect(beau.config.HOST).toBe(host); + expect(beau.config.CACHE).toBe(cache); + expect(beau.config.VERSION).toBe(version); expect(beau.config.shouldntBeAdded).toBeUndefined(); }); }); diff --git a/__tests__/request.spec.js b/__tests__/request.spec.js index be43383..884f337 100644 --- a/__tests__/request.spec.js +++ b/__tests__/request.spec.js @@ -10,14 +10,15 @@ describe('Request', () => { beforeEach(() => { req = { request: 'POST /user', - HOST: 'http://martianwabbit.com', - PARAMS: { + host: 'http://martianwabbit.com', + alias: 'profile', + params: { userId: '$profile.UserId' }, - HEADERS: { + headers: { authentication: 'BEARER $session.token' }, - PAYLOAD: { + payload: { username: 'seich' } }; @@ -30,16 +31,16 @@ describe('Request', () => { }); test('It should load up the given request', () => { - expect(request.$verb).toBe('POST'); - expect(request.$endpoint).toBe(req.HOST + '/user'); - expect(request.$headers).toBeDefined(); - expect(request.$payload).toBeDefined(); - expect(request.$params).toBeDefined(); + expect(request.VERB).toBe('POST'); + expect(request.ENDPOINT).toBe(req.host + '/user'); + expect(request.HEADERS).toBeDefined(); + expect(request.PAYLOAD).toBeDefined(); + expect(request.PARAMS).toBeDefined(); }); test('It should list all of its dependencies', () => { - expect(request.$dependencies.size).toBe(2); - expect(request.$dependencies).toContain('$session'); - expect(request.$dependencies).toContain('$profile'); + expect(request.DEPENDENCIES.size).toBe(2); + expect(request.DEPENDENCIES).toContain('$session'); + expect(request.DEPENDENCIES).toContain('$profile'); }); }); diff --git a/__tests__/requestList.spec.js b/__tests__/requestList.spec.js index 80dc7de..63109f5 100644 --- a/__tests__/requestList.spec.js +++ b/__tests__/requestList.spec.js @@ -6,8 +6,8 @@ describe('RequestList', () => { 'POST /session': null, 'Not a Request': null, 'POST /user': { - ALIAS: '$user', - PAYLOAD: { + alias: 'user', + payload: { name: 'Sergio', lastname: 'Diaz' } @@ -20,7 +20,7 @@ describe('RequestList', () => { let request = requests.list[0]; expect(requests.list.length).toBe(2); - expect(request.$verb).toBe('POST'); - expect(request.$endpoint).toBe(host + '/session'); + expect(request.VERB).toBe('POST'); + expect(request.ENDPOINT).toBe(host + '/session'); }); }); diff --git a/bin/beau b/bin/beau index bb2f243..e0a0af6 100755 --- a/bin/beau +++ b/bin/beau @@ -37,11 +37,11 @@ if (program.list) { .column('Endpoint', 20, [clc.cyan]) .output(); - beau.requests.list.forEach(({$verb, $alias, $endpoint}) => + beau.requests.list.forEach(({VERB, ALIAS, ENDPOINT}) => new Line().padding(2) - .column($verb, 20, [clc.yellow]) - .column($alias, 30, [clc.yellow]) - .column($endpoint) + .column(VERB, 20, [clc.yellow]) + .column(ALIAS, 30, [clc.yellow]) + .column(ENDPOINT) .output() ); @@ -49,13 +49,12 @@ if (program.list) { } if (program.request) { - const request = `$${program.request}`; - const spinner = new Spinner(clc.yellow(`Requesting: ${request}`)); + const spinner = new Spinner(clc.yellow(`Requesting: ${program.request}`)); spinner.start(); beau.requests - .execByAlias(request) + .execByAlias(program.request) .then(res => { spinner.stop(); diff --git a/examples/jsonplaceholer.yml b/examples/jsonplaceholer.yml new file mode 100644 index 0000000..2df9842 --- /dev/null +++ b/examples/jsonplaceholer.yml @@ -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 diff --git a/examples/slack.yml b/examples/slack.yml index 833679e..7443223 100644 --- a/examples/slack.yml +++ b/examples/slack.yml @@ -2,27 +2,27 @@ VERSION: '1' HOST: https://slack.com/api auth: &auth - token: xoxp-139455775026-139455775090-140286212801-4a786b8b600db898df76302a0bf0784c + token: xoxp-139455775026-139455775090-147751461120-f224ed6ffee029869a0f138d0859e7d6 GET /users.getPresence: - ALIAS: $presence + ALIAS: presence PARAMS: <<: *auth GET /channels.list: - ALIAS: $channel-list + ALIAS: channel-list PARAMS: <<: *auth exclude_archived: true GET /channels.info: - ALIAS: $channel-info + ALIAS: channel-info PARAMS: <<: *auth channel: $channel-list.response.body.channels.0.id POST /chat.postMessage: - ALIAS: $new-message + ALIAS: new-message PARAMS: <<: *auth channel: $channel-info.response.body.channel.id @@ -32,6 +32,6 @@ POST /chat.postMessage: username: Beau GET /users.list: - ALIAS: $user-list + ALIAS: user-list PARAMS: <<: *auth diff --git a/request.js b/request.js index af3f41a..b7cb331 100644 --- a/request.js +++ b/request.js @@ -5,18 +5,23 @@ const RequestCache = require('./requestCache'); class Request { constructor(req, list) { - let { request, ALIAS, PAYLOAD, HOST, PARAMS, HEADERS } = req; - let { verb, endpoint } = this.parseRequest(request); - this.$verb = verb; - this.$endpoint = HOST + endpoint; + let config = {}; - this.$headers = HEADERS; - this.$payload = PAYLOAD; - this.$params = PARAMS; + Object.keys(req).forEach(k => config[k.toUpperCase()] = req[k]); - this.$alias = ALIAS; - this.$dependencies = this.findDependencies(req); + let { REQUEST, ALIAS, PAYLOAD, HOST, PARAMS, HEADERS } = config; + 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; } @@ -33,14 +38,14 @@ class Request { findDependencies(request, set = new Set()) { if (typeof request === 'object') { Object.keys(request).forEach(key => { - if (key === 'ALIAS' || key.startsWith('$')) + if (key === 'ALIAS') return; set = this.findDependencies(request[key], set); }); } else if (typeof request === 'string') { 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]); } @@ -49,15 +54,15 @@ class Request { } exec() { - let dependencies = Array.from(this.$dependencies); + let dependencies = Array.from(this.DEPENDENCIES); return this.list.fetchDependencies(dependencies).then(cache => { - let endpoint = cache.parse(this.$endpoint); - let request = unirest(this.$verb, endpoint); + let endpoint = cache.parse(this.ENDPOINT); + let request = unirest(this.VERB, endpoint); - request.headers(cache.parse(this.$headers)); - request.query(cache.parse(this.$params)); - request.send(cache.parse(this.$payload)); + request.headers(cache.parse(this.HEADERS)); + request.query(cache.parse(this.PARAMS)); + request.send(cache.parse(this.PAYLOAD)); return new Promise((resolve, reject) => { request.end(res => { @@ -74,7 +79,7 @@ class Request { } }; - cache.add(this.$alias, results); + cache.add(`$${this.ALIAS}`, results); resolve(results); }); diff --git a/requestList.js b/requestList.js index e22a537..07a24c1 100644 --- a/requestList.js +++ b/requestList.js @@ -10,7 +10,7 @@ class RequestList { } execByAlias(alias) { - let request = this.list.find(r => r.$alias === alias); + let request = this.list.find(r => r.ALIAS === alias); if (typeof request === 'undefined') { return Promise.reject(`${alias} not found among the requests.`); @@ -20,7 +20,7 @@ class RequestList { .exec() .catch(reason => { return Promise - .reject(`${request.$verb} ${request.$endpoint} FAILED. \nDependencies not met:\n${reason}`); + .reject(`${request.VERB} ${request.ENDPOINT} FAILED. \nDependencies not met:\n${reason}`); }); } diff --git a/shared.js b/shared.js index 3620cd8..516a5c6 100644 --- a/shared.js +++ b/shared.js @@ -1,6 +1,6 @@ const httpVerbs = ['POST', 'GET', 'PUT', 'PATCH', 'DELETE']; const requestRegex = new RegExp(`(${httpVerbs.join('|')})\\s(.*)`, 'i'); -const replacementRegex = /(\$[a-zA-Z\.\d\-\_]*)/g; +const replacementRegex = /\$([a-zA-Z\.\d\-\_]*)/g; module.exports = { httpVerbs,