diff --git a/README.md b/README.md index 15f43ee..80bb6f3 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,24 @@ Or use WordNet's inherited method: wordpos.lookup('great', console.log); // ... ``` +### Options + +```js +WordPOS.defaults = { + /** + * enable profiling, time in msec returned as second argument in callback + */ + profile: false +}; +``` +To override, pass an options hash to the constructor: + +```js + wordpos = new WordPOS({profile: true}); +``` + +With the `profile` option, all callbacks receive a second argument that is the execution time in msec of the call. + Benchmark ---------- diff --git a/package.json b/package.json index 8cdb8e3..87515ab 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "author": "Moos ", "keywords": ["natural", "language", "wordnet", "pos"], "description": "wordpos is a set of part-of-speech utilities for Node.js using natural's WordNet module.", - "version": "0.1.1", + "version": "0.1.2", "homepage": "https://github.com/moos/wordpos", "engines": { "node": ">=0.4.10" diff --git a/wordpos.js b/wordpos.js index 187e23a..f246f2c 100644 --- a/wordpos.js +++ b/wordpos.js @@ -29,51 +29,81 @@ function prepText(text) { function lookup(pos) { return function(word, callback) { + var profile = this.options.profile, + start = profile && new Date(), + args = []; word = normalize(word); this.lookupFromFiles([ {index: this.getIndexFile(pos), data: this.getDataFile(pos)} - ], [], word, callback); + ], [], word, function(results){ + args.push(results); + profile && args.push(new Date() - start); + callback.apply(null, args); + }); }; } function is(pos){ - return function(word, callback) { - var index = this.getIndexFile(pos); + return function(word, callback, _noprofile) { + // disable profiling when isX() used internally + var profile = this.options.profile && !_noprofile, + start = profile && new Date(), + args = [], + index = this.getIndexFile(pos); word = normalize(word); index.lookup(word, function(record) { - callback(!!record); + args.push(!!record); + profile && args.push(new Date() - start); + callback.apply(null, args); }); }; } function get(isFn) { return function(text, callback) { - var words = prepText(text), + var profile = this.options.profile, + start = profile && new Date(), + words = prepText(text), n = words.length, i = 0, self = this, - results = []; - - if (!n) return callback(results); + results = [], + args = [results]; + profile && args.push(0); + if (!n) return callback.apply(null, args); words.forEach(function(word,j){ self[isFn](word, function(yes){ yes && results.push(word); - (++i==n) && callback(results); - }); + if (++i==n) { + profile && (args[1] = new Date() - start); + callback.apply(null, args); + } + }, /*_noprofile*/ true); }); }; } - -var WordPOS = function() { - if (arguments.length == 0) { +/** + * @class WordPOS + * @constructor + */ +var WordPOS = function(options) { + if (arguments.length == 0 || _.isObject(options)) { WordPOS.super_.call(this, WNdb.path); } else { WordPOS.super_.apply(this, arguments); } + this.options = _.defaults({}, _.isObject(options) && options || {}, WordPOS.defaults); }; util.inherits(WordPOS, WordNet); +WordPOS.defaults = { + /** + * enable profiling, time in msec returned as second argument in callback + */ + profile: false +}; + var wordposProto = WordPOS.prototype; // fast POS lookups (only look in specified file) @@ -142,6 +172,9 @@ if (!wordposProto.getIndexFile) { */ wordposProto.getPOS = function(text, callback) { var data = {nouns:[], verbs:[], adjectives:[], adverbs:[], rest:[]}, + profile = this.options.profile, + start = profile && new Date(), + args = [data], testFns = 'isNoun isVerb isAdjective isAdverb'.split(' '), parts = 'nouns verbs adjectives adverbs'.split(' '), words = prepText(text), @@ -150,7 +183,8 @@ wordposProto.getPOS = function(text, callback) { self = this, c = 0; - if (!nWords) return callback(data); + profile && args.push(0); + if (!nWords) return callback.apply(null, args); words.forEach(lookup); function lookup(word){ @@ -177,7 +211,8 @@ wordposProto.getPOS = function(text, callback) { function done(){ if (++c == nWords) { - callback(data); + profile && (args[1] = new Date() - start); + callback.apply(null, args); } } }; diff --git a/wordpos_spec.js b/wordpos_spec.js index 6fad43a..c28347e 100644 --- a/wordpos_spec.js +++ b/wordpos_spec.js @@ -175,3 +175,48 @@ describe('lookup POS', function() { }); }); +describe('options passed to constructor', function() { + var wp, origProfile = WordPOS.defaults.profile; + + it('should override default option', function(){ + wp = new WordPOS({profile:123}); + expect(wp.options.profile).toEqual(123); + expect(WordPOS.defaults.profile).toEqual(origProfile); + }); + + it('should not erase default option', function(){ + wp = new WordPOS({aaa:123}); + expect(wp.options.aaa).toEqual(123); + expect(wp.options.profile).toEqual(WordPOS.defaults.profile); + }); +}); + +describe('profile option', function() { + + var wp = new WordPOS({profile : true}); + + it('should return time argument for isX()', function(){ + wp.isNoun(garble, function(result, time) { + expect(time).toBeDefined(); + asyncSpecDone(); + }); + asyncSpecWait(); + }); + + it('should return time argument for getX()', function(){ + wp.getNouns(garble, function(result, time) { + expect(time).toBeDefined(); + asyncSpecDone(); + }); + asyncSpecWait(); + }); + + it('should return time argument for lookupX()', function(){ + wp.isNoun(garble, function(result, time) { + expect(time).toBeDefined(); + asyncSpecDone(); + }); + asyncSpecWait(); + }); +}); +