From e0c7eac50dfbfa6052704f088377089f74380ab7 Mon Sep 17 00:00:00 2001 From: Meir Rotstein Date: Sun, 19 Nov 2017 17:34:42 +0200 Subject: [PATCH] create logger instance per Ajv instance --- lib/ajv.js | 24 ++++++++++------- lib/compile/index.js | 9 +++---- lib/compile/logger.js | 62 +++++++++++++++++++------------------------ spec/logger.spec.js | 21 ++++++++++----- spec/options.spec.js | 6 ++--- 5 files changed, 63 insertions(+), 59 deletions(-) diff --git a/lib/ajv.js b/lib/ajv.js index fb812f0..2fe5e7e 100644 --- a/lib/ajv.js +++ b/lib/ajv.js @@ -10,7 +10,7 @@ var compileSchema = require('./compile') , $dataMetaSchema = require('./$data') , patternGroups = require('./patternGroups') , util = require('./compile/util') - , logger = require('./compile/logger') + , Logger = require('./compile/logger') , co = require('co'); module.exports = Ajv; @@ -53,6 +53,7 @@ var META_SUPPORT_DATA = ['/properties']; function Ajv(opts) { if (!(this instanceof Ajv)) return new Ajv(opts); opts = this._opts = util.copy(opts) || {}; + setLogger(this); this._schemas = {}; this._refs = {}; this._fragments = {}; @@ -76,7 +77,6 @@ function Ajv(opts) { if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); addInitialSchemas(this); if (opts.patternGroups) patternGroups(this); - if (opts.logger !== undefined) setLogger(this); } @@ -168,7 +168,7 @@ function validateSchema(schema, throwOrLogError) { throw new Error('$schema must be a string'); $schema = $schema || this._opts.defaultMeta || defaultMeta(this); if (!$schema) { - logger.warn('meta-schema not available'); + this.logger.warn('meta-schema not available'); this.errors = null; return true; } @@ -181,7 +181,7 @@ function validateSchema(schema, throwOrLogError) { finally { this._formats.uri = currentUriFormat; } if (!valid && throwOrLogError) { var message = 'schema is invalid: ' + this.errorsText(); - if (this._opts.validateSchema == 'log') logger.error(message); + if (this._opts.validateSchema == 'log') this.logger.error(message); else throw new Error(message); } return valid; @@ -380,15 +380,15 @@ function chooseGetId(opts) { } } - +/* @this Ajv */ function _getId(schema) { - if (schema.$id) logger.warn('schema $id ignored', schema.$id); + if (schema.$id) this.logger.warn('schema $id ignored', schema.$id); return schema.id; } - +/* @this Ajv */ function _get$Id(schema) { - if (schema.id) logger.warn('schema id ignored', schema.id); + if (schema.id) this.logger.warn('schema id ignored', schema.id); return schema.$id; } @@ -479,6 +479,10 @@ function getMetaSchemaOptions(self) { } function setLogger(self) { - if(self._opts.logger === false) logger.set(null); - if(typeof self._opts.logger === 'object') logger.set(self._opts.logger); + var loggerObj; + + if(self._opts.logger === false) loggerObj = null; + if(typeof self._opts.logger === 'object') loggerObj = self._opts.logger; + + self.logger = new Logger(loggerObj); } diff --git a/lib/compile/index.js b/lib/compile/index.js index 3da36ab..cf4f5b8 100644 --- a/lib/compile/index.js +++ b/lib/compile/index.js @@ -3,8 +3,7 @@ var resolve = require('./resolve') , util = require('./util') , errorClasses = require('./error_classes') - , stableStringify = require('fast-json-stable-stringify') - , logger = require('./logger'); + , stableStringify = require('fast-json-stable-stringify'); var validateGenerator = require('../dotjs/validate'); @@ -105,7 +104,7 @@ function compile(schema, root, localRefs, baseId) { useCustomRule: useCustomRule, opts: opts, formats: formats, - logger: logger, + logger: self.logger, self: self }); @@ -148,7 +147,7 @@ function compile(schema, root, localRefs, baseId) { refVal[0] = validate; } catch(e) { - logger.error('Error compiling schema, function code:', sourceCode); + self.logger.error('Error compiling schema, function code:', sourceCode); throw e; } @@ -262,7 +261,7 @@ function compile(schema, root, localRefs, baseId) { var valid = validateSchema(schema); if (!valid) { var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); - if (self._opts.validateSchema == 'log') logger.error(message); + if (self._opts.validateSchema == 'log') self.logger.error(message); else throw new Error(message); } } diff --git a/lib/compile/logger.js b/lib/compile/logger.js index 7cad56b..133b824 100644 --- a/lib/compile/logger.js +++ b/lib/compile/logger.js @@ -1,47 +1,41 @@ 'use strict'; -var logger; +module.exports = Logger; -_reset(); +/** + * @constructor + * @this Logger + * @param {*=} loggerObj logger object, expected to implement log, warn and error, if not given global console will be taken. + */ +function Logger(loggerObj) { + if(loggerObj && typeof loggerObj === 'object') + this.logger = loggerObj; + else if(typeof loggerObj === 'undefined') + this.logger = typeof console === 'object' ? console : {log: noop, warn: noop, error: noop}; + else + this.logger = null; +} -module.exports = { - log: _logFunc('log'), - warn: _logFunc('warn'), - error: _logFunc('error'), - set: _setLogger, - reset: _reset +Logger.prototype.log = function() { + _logFunc.call(this, 'log', arguments); +}; + +Logger.prototype.warn = function() { + _logFunc.call(this, 'warn', arguments); +}; + +Logger.prototype.error = function() { + _logFunc.call(this, 'error', arguments); }; /** + * @this Logger * @param {String} level log level - log, warn or error - * @return {Function} log function + * @param {Array} args log argumets * @private */ -function _logFunc(level) { - /** - * @this Ajv - */ - return function() { - if(logger && logger[level]) logger[level].apply(this, arguments); - }; -} - -/** - * Set actual logger object, in order to disable the logger send non object or null - * @param {*} loggerObj logger object, expected to implement log, warn and error, if not it gets noop implementation. - */ -function _setLogger(loggerObj) { - if(loggerObj && typeof loggerObj === 'object') - logger = loggerObj; - else - logger = null; -} - -/** - * Reset logger to global console - */ -function _reset() { - logger = typeof console === 'object' ? console : {log: noop, warn: noop, error: noop}; +function _logFunc(level, args) { + if(this.logger && this.logger[level]) this.logger[level].apply(this, args); } function noop() {} \ No newline at end of file diff --git a/spec/logger.spec.js b/spec/logger.spec.js index 2b2b80f..c6bb2fb 100644 --- a/spec/logger.spec.js +++ b/spec/logger.spec.js @@ -1,9 +1,12 @@ 'use strict'; -var logger = require('../lib/compile/logger') +var Logger = require('../lib/compile/logger') , should = require('./chai').should(); describe('logger object tests', function() { + + var logger; + var origConsoleWarn = console.warn; var origConsoleLog = console.log; var origConsoleError = console.error; @@ -32,11 +35,13 @@ describe('logger object tests', function() { console.warn = origConsoleWarn; console.log = origConsoleLog; console.error = origConsoleError; - logger.reset(); consoleErrorCalled = consoleLogCalled = consoleWarnCalled = false; }); it('logger should log into global console by default', function() { + + logger = new Logger(); + logger.log('42'); logger.warn('42'); logger.error('42'); @@ -46,8 +51,7 @@ describe('logger object tests', function() { should.equal(consoleErrorCalled, true); }); - it('logger should log only into a custom logger if given console by default', function() { - + it('logger should log only into a custom logger if given', function() { var customWarnCalled = false; var customLogCalled = false; var customErrorCalled = false; @@ -64,7 +68,8 @@ describe('logger object tests', function() { } }; - logger.set(customLogger); + logger = new Logger(customLogger); + logger.log('42'); logger.warn('42'); logger.error('42'); @@ -79,7 +84,8 @@ describe('logger object tests', function() { }); it('if a custom logger is given without basic logging functions implementations it should not leads to an exception', function() { - logger.set({}); + logger = new Logger({}); + logger.log('42'); logger.warn('42'); logger.error('42'); @@ -90,7 +96,8 @@ describe('logger object tests', function() { }); it('if a custom logger is set to null logging should be disabled', function() { - logger.set(null); + logger = new Logger(null); + logger.log('42'); logger.warn('42'); logger.error('42'); diff --git a/spec/options.spec.js b/spec/options.spec.js index 3fdf18c..ea30f94 100644 --- a/spec/options.spec.js +++ b/spec/options.spec.js @@ -1240,7 +1240,7 @@ describe('Ajv Options', function () { consoleCalled = false; }); - it('logger is undefined - global console should be in use', function() { + it('no custom logger is given - global console should be in use', function() { var ajv = new Ajv({ meta: false @@ -1254,7 +1254,7 @@ describe('Ajv Options', function () { should.equal(consoleCalled, true); }); - it('logger is an object - logs should only reported to it', function() { + it('custom logger is an object - logs should only reported to it', function() { var loggerCalled = false; @@ -1278,7 +1278,7 @@ describe('Ajv Options', function () { should.equal(consoleCalled, false); }); - it('logger is an object but not implements the basic functions - make sure that it not leads to an error', function() { + it('custom logger is an object but not implements the basic functions - make sure that it not leads to an error', function() { var logger = {};