wrote basic functionality
parent
ccebaa8115
commit
77d117e7a8
@ -1,20 +1,65 @@
|
||||
'use strict';
|
||||
|
||||
var inquirer = require('inquirer');
|
||||
var chalk = require('chalk');
|
||||
|
||||
exports.narrowDown = narrowDown;
|
||||
exports.select = select;
|
||||
exports.selectArticle = selectArticle;
|
||||
|
||||
function narrowDown(articles, terms) {
|
||||
function narrowDown(articles, terms, deep) {
|
||||
var reSearchTerms = terms.map(function mapRE(term) {
|
||||
return new RegExp(term, 'i');
|
||||
});
|
||||
|
||||
return articles.filter(function filterOnTitle(article) {
|
||||
return reSearchTerms.every(function checkRE(reTerm) {
|
||||
return reTerm.test(article.title);
|
||||
});
|
||||
var filtered = articles.filter(function filterOutCategoryPages(article) {
|
||||
return !article.category;
|
||||
});
|
||||
|
||||
if (deep) {
|
||||
return filtered.filter(function filterOnTitle(article) {
|
||||
return reSearchTerms.every(function checkRE(reTerm) {
|
||||
return reTerm.test(article.title) || reTerm.test(article.description);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
return filtered.filter(function filterOnTitle(article) {
|
||||
return reSearchTerms.every(function checkRE(reTerm) {
|
||||
return reTerm.test(article.title);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function select() {
|
||||
function selectArticle(articles) {
|
||||
return new Promise(function makePromise(resolve, reject) {
|
||||
var len = articles.length;
|
||||
var choices;
|
||||
var entry;
|
||||
|
||||
var sorted = articles.sort(function sortSpecialLast(a, b) {
|
||||
return (/\-/.test(a.title.split(' ')[0]) && !/\-/.test(b.title.split(' ')[0])) || (/DeveloperWiki/.test(a.title.split(' ')[0]) && /DeveloperWiki/.test(b.title.split(' ')[0])) || a.title.length > b.title.length ? 1 : -1;
|
||||
});
|
||||
|
||||
if (len === 0) {
|
||||
return reject('No articles match your query.');
|
||||
} else if (len === 1) {
|
||||
return resolve(sorted[0]);
|
||||
} else {
|
||||
choices = sorted.map(function makeChoices(article, index) {
|
||||
entry = ['[', chalk.yellow(index + 1), '/', chalk.yellow(len), '] ', chalk.green(article.title), ': ', chalk.gray(article.description).slice(0, 150)].join('');
|
||||
return (article.description.length < 150) ? entry : entry + '...';
|
||||
});
|
||||
|
||||
inquirer.prompt([{
|
||||
type: 'list',
|
||||
name: 'selection',
|
||||
message: 'Select the Arch Wiki article',
|
||||
choices: choices,
|
||||
pageSize: 15,
|
||||
}], function getAnswer(response) {
|
||||
var pos = choices.indexOf(response.selection);
|
||||
return resolve(sorted[pos]);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -0,0 +1,59 @@
|
||||
/* eslint-env mocha */
|
||||
/* eslint func-names:0 no-unused-expressions:0 */
|
||||
|
||||
'use strict';
|
||||
|
||||
var expect = require('chai').expect;
|
||||
var find = require('../lib/find');
|
||||
// var fsReadFile = Promise.promisify(require('fs').readFile);
|
||||
// var fsUnlink = Promise.promisify(require('fs').unlink);
|
||||
// var fsWriteFile = Promise.promisify(require('fs').writeFile);
|
||||
// var path = require('path');
|
||||
|
||||
describe('methods', function() {
|
||||
it('has a narrowDown function', function() {
|
||||
expect(find.narrowDown).to.be.a('function');
|
||||
});
|
||||
|
||||
it('has a selectArticle function', function() {
|
||||
expect(find.selectArticle).to.be.a('function');
|
||||
});
|
||||
});
|
||||
|
||||
describe('narrowDown', function() {
|
||||
var articles = [{title: 'foo1'}, {title: 'bar foo 2'}, {title: 'bar'}];
|
||||
|
||||
it('returns empty array if no terms match', function() {
|
||||
expect(find.narrowDown(articles, ['baz', 'bam']).length).to.equal(0);
|
||||
expect(find.narrowDown(articles, ['foo bar']).length).to.equal(0);
|
||||
});
|
||||
|
||||
it('returns the matching articles', function() {
|
||||
expect(find.narrowDown(articles, ['bar foo']).length).to.equal(1);
|
||||
expect(find.narrowDown(articles, ['foo', 'bar']).length).to.equal(1);
|
||||
expect(find.narrowDown(articles, ['foo']).length).to.equal(2);
|
||||
expect(find.narrowDown(articles, ['bar']).length).to.equal(2);
|
||||
});
|
||||
});
|
||||
|
||||
describe('selectArticle', function() {
|
||||
it('throws an error if the passed in articles array is empty', function(done) {
|
||||
find.selectArticle([]).then(function() {
|
||||
// this should never run
|
||||
console.warning('check ./test/find.js because you should never see this');
|
||||
done();
|
||||
}).catch(function(err) {
|
||||
expect(err).to.be.a('string');
|
||||
expect(err).to.equal('No articles match your query.');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('returns the article when the passed in articles array only contains one item', function(done) {
|
||||
find.selectArticle([{title: 'foo'}]).then(function(data) {
|
||||
expect(data).to.be.an('object');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue