[dist api test] Refactor pluggable nconf-level logic into nconf.Provider. Update .gitignore for npm 1.0. Update pathing in source and tests to be more require.paths
future-proof
This commit is contained in:
parent
4a61560671
commit
9da37dff2a
12 changed files with 167 additions and 158 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
config.json
|
config.json
|
||||||
test/fixtures/*.json
|
test/fixtures/*.json
|
||||||
|
node_modules
|
146
lib/nconf.js
146
lib/nconf.js
|
@ -5,143 +5,14 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require.paths.unshift(__dirname);
|
var Provider = require('./nconf/provider').Provider,
|
||||||
|
nconf = module.exports = Object.create(Provider.prototype);
|
||||||
var nconf = exports;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ### Version 0.1.7 :: 4/20/2011
|
// ### Version 0.1.7 :: 4/20/2011
|
||||||
//
|
//
|
||||||
nconf.version = [0, 1, 7];
|
nconf.version = [0, 1, 7];
|
||||||
|
|
||||||
//
|
|
||||||
// Include the various store types exposed by nconf
|
|
||||||
//
|
|
||||||
nconf.stores = require('nconf/stores');
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function use (type, options)
|
|
||||||
// #### @type {string} Type of the nconf store to use.
|
|
||||||
// #### @options {Object} Options for the store instance.
|
|
||||||
// Sets the active `nconf.store` to a new instance of the
|
|
||||||
// specified `type`.
|
|
||||||
//
|
|
||||||
nconf.use = function (type, options) {
|
|
||||||
if (!nconf.store || type.toLowerCase() !== nconf.store.type) {
|
|
||||||
nconf.store = new nconf.stores.create(type, options);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function get (key, callback)
|
|
||||||
// #### @key {string} Key to retrieve for this instance.
|
|
||||||
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
||||||
// Retrieves the value for the specified key (if any).
|
|
||||||
//
|
|
||||||
nconf.get = function (key, callback) {
|
|
||||||
return nconf.store.get(key, callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function set (key, value, callback)
|
|
||||||
// #### @key {string} Key to set in this instance
|
|
||||||
// #### @value {literal|Object} Value for the specified key
|
|
||||||
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
||||||
// Sets the `value` for the specified `key` in this instance.
|
|
||||||
//
|
|
||||||
nconf.set = function (key, value, callback) {
|
|
||||||
return nconf.store.set(key, value, callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function clear (key, callback)
|
|
||||||
// #### @key {string} Key to remove from this instance
|
|
||||||
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
||||||
// Removes the value for the specified `key` from this instance.
|
|
||||||
//
|
|
||||||
nconf.clear = function (key, callback) {
|
|
||||||
return nconf.store.clear(key, callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function load (callback)
|
|
||||||
// #### @callback {function} Continuation to respond to when complete.
|
|
||||||
// Responds with an Object representing all keys associated in this instance.
|
|
||||||
//
|
|
||||||
nconf.load = function (callback) {
|
|
||||||
//
|
|
||||||
// If we don't have a callback and the current
|
|
||||||
// store is capable of loading synchronously
|
|
||||||
// then do so.
|
|
||||||
//
|
|
||||||
if (!callback && nconf.store.loadSync) {
|
|
||||||
return nconf.store.loadSync();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!nconf.store.load) {
|
|
||||||
var error = new Error('nconf store ' + nconf.store.type + ' has no load() method');
|
|
||||||
if (callback) {
|
|
||||||
return callback (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nconf.store.load(callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function save (value, callback)
|
|
||||||
// #### @value {Object} **Optional** Config object to set for this instance
|
|
||||||
// #### @callback {function} Continuation to respond to when complete.
|
|
||||||
// Removes any existing configuration settings that may exist in this
|
|
||||||
// instance and then adds all key-value pairs in `value`.
|
|
||||||
//
|
|
||||||
nconf.save = function (value, callback) {
|
|
||||||
if (!callback) {
|
|
||||||
callback = value;
|
|
||||||
value = null;
|
|
||||||
|
|
||||||
//
|
|
||||||
// If we still don't have a callback and the
|
|
||||||
// current store is capable of saving synchronously
|
|
||||||
// then do so.
|
|
||||||
//
|
|
||||||
if (!callback && nconf.store.saveSync) {
|
|
||||||
return nconf.store.saveSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nconf.store.save) {
|
|
||||||
var error = new Error('nconf store ' + nconf.store.type + ' has no save() method');
|
|
||||||
if (callback) {
|
|
||||||
return callback (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nconf.store.save(value, callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function reset (callback)
|
|
||||||
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
||||||
// Clears all keys associated with this instance.
|
|
||||||
//
|
|
||||||
nconf.reset = function (callback) {
|
|
||||||
return nconf.store.reset(callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// ### function key (arguments)
|
|
||||||
// Returns a `:` joined string from the `arguments`.
|
|
||||||
//
|
|
||||||
nconf.key = function () {
|
|
||||||
return Array.prototype.slice.call(arguments).join(':');
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ### function path (key)
|
// ### function path (key)
|
||||||
// #### @key {string} The ':' delimited key to split
|
// #### @key {string} The ':' delimited key to split
|
||||||
|
@ -152,6 +23,15 @@ nconf.path = function (key) {
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Use the `memory` engine by default
|
// ### function key (arguments)
|
||||||
|
// Returns a `:` joined string from the `arguments`.
|
||||||
//
|
//
|
||||||
nconf.use('memory');
|
nconf.key = function () {
|
||||||
|
return Array.prototype.slice.call(arguments).join(':');
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose the various components included with nconf
|
||||||
|
//
|
||||||
|
nconf.stores = require('./nconf/stores');
|
||||||
|
nconf.Provider = Provider;
|
127
lib/nconf/provider.js
Normal file
127
lib/nconf/provider.js
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* provider.js: Abstraction providing an interface into pluggable configuration storage.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var stores = require('./stores');
|
||||||
|
|
||||||
|
var Provider = exports.Provider = function (options) {
|
||||||
|
options = options || {};
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function use (type, options)
|
||||||
|
// #### @type {string} Type of the nconf store to use.
|
||||||
|
// #### @options {Object} Options for the store instance.
|
||||||
|
// Sets the active `this.store` to a new instance of the
|
||||||
|
// specified `type`.
|
||||||
|
//
|
||||||
|
Provider.prototype.use = function (type, options) {
|
||||||
|
if (!this.store || type.toLowerCase() !== this.store.type) {
|
||||||
|
this.store = new stores.create(type, options);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function get (key, callback)
|
||||||
|
// #### @key {string} Key to retrieve for this instance.
|
||||||
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
||||||
|
// Retrieves the value for the specified key (if any).
|
||||||
|
//
|
||||||
|
Provider.prototype.get = function (key, callback) {
|
||||||
|
return this.store.get(key, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function set (key, value, callback)
|
||||||
|
// #### @key {string} Key to set in this instance
|
||||||
|
// #### @value {literal|Object} Value for the specified key
|
||||||
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
||||||
|
// Sets the `value` for the specified `key` in this instance.
|
||||||
|
//
|
||||||
|
Provider.prototype.set = function (key, value, callback) {
|
||||||
|
return this.store.set(key, value, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function clear (key, callback)
|
||||||
|
// #### @key {string} Key to remove from this instance
|
||||||
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
||||||
|
// Removes the value for the specified `key` from this instance.
|
||||||
|
//
|
||||||
|
Provider.prototype.clear = function (key, callback) {
|
||||||
|
return this.store.clear(key, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function load (callback)
|
||||||
|
// #### @callback {function} Continuation to respond to when complete.
|
||||||
|
// Responds with an Object representing all keys associated in this instance.
|
||||||
|
//
|
||||||
|
Provider.prototype.load = function (callback) {
|
||||||
|
//
|
||||||
|
// If we don't have a callback and the current
|
||||||
|
// store is capable of loading synchronously
|
||||||
|
// then do so.
|
||||||
|
//
|
||||||
|
if (!callback && this.store.loadSync) {
|
||||||
|
return this.store.loadSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!this.store.load) {
|
||||||
|
var error = new Error('nconf store ' + this.store.type + ' has no load() method');
|
||||||
|
if (callback) {
|
||||||
|
return callback (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.store.load(callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function save (value, callback)
|
||||||
|
// #### @value {Object} **Optional** Config object to set for this instance
|
||||||
|
// #### @callback {function} Continuation to respond to when complete.
|
||||||
|
// Removes any existing configuration settings that may exist in this
|
||||||
|
// instance and then adds all key-value pairs in `value`.
|
||||||
|
//
|
||||||
|
Provider.prototype.save = function (value, callback) {
|
||||||
|
if (!callback) {
|
||||||
|
callback = value;
|
||||||
|
value = null;
|
||||||
|
|
||||||
|
//
|
||||||
|
// If we still don't have a callback and the
|
||||||
|
// current store is capable of saving synchronously
|
||||||
|
// then do so.
|
||||||
|
//
|
||||||
|
if (!callback && this.store.saveSync) {
|
||||||
|
return this.store.saveSync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.store.save) {
|
||||||
|
var error = new Error('nconf store ' + this.store.type + ' has no save() method');
|
||||||
|
if (callback) {
|
||||||
|
return callback (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.store.save(value, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// ### function reset (callback)
|
||||||
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
||||||
|
// Clears all keys associated with this instance.
|
||||||
|
//
|
||||||
|
Provider.prototype.reset = function (callback) {
|
||||||
|
return this.store.reset(callback);
|
||||||
|
};
|
|
@ -5,15 +5,24 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var stores = exports;
|
var fs = require('fs'),
|
||||||
|
stores = exports;
|
||||||
|
|
||||||
function capitalize (str) {
|
function capitalize (str) {
|
||||||
return str && str[0].toUpperCase() + str.slice(1);
|
return str && str[0].toUpperCase() + str.slice(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
stores.Memory = require('nconf/stores/memory').Memory;
|
//
|
||||||
stores.File = require('nconf/stores/file').File;
|
// Setup all stores as lazy-loaded getters.
|
||||||
stores.Redis = require('nconf/stores/redis').Redis;
|
//
|
||||||
|
fs.readdirSync(__dirname + '/stores').forEach(function (file) {
|
||||||
|
var store = file.replace('.js', ''),
|
||||||
|
name = capitalize(store);
|
||||||
|
|
||||||
|
stores.__defineGetter__(name, function () {
|
||||||
|
return require('./stores/' + store)[name];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
//
|
//
|
||||||
// ### function create (type, options)
|
// ### function create (type, options)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var nconf = require('nconf');
|
var nconf = require('../../nconf');
|
||||||
|
|
||||||
//
|
//
|
||||||
// ### function Memory (options)
|
// ### function Memory (options)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
var async = require('async'),
|
var async = require('async'),
|
||||||
redis = require('redis'),
|
redis = require('redis'),
|
||||||
nconf = require('nconf'),
|
nconf = require('../../nconf'),
|
||||||
Memory = require('./memory').Memory;
|
Memory = require('./memory').Memory;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -38,7 +38,7 @@ var Redis = exports.Redis = function (options) {
|
||||||
|
|
||||||
// Suppress errors from the Redis client
|
// Suppress errors from the Redis client
|
||||||
this.redis.on('error', function (err) {
|
this.redis.on('error', function (err) {
|
||||||
require('eyes').inspect(err);
|
console.dir(err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,10 @@
|
||||||
},
|
},
|
||||||
"keywords": ["configuration", "key value store", "redis"],
|
"keywords": ["configuration", "key value store", "redis"],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": ">= 0.1.8",
|
"async": ">= 0.1.x",
|
||||||
"redis": ">= 0.5.9",
|
"redis": ">= 0.5.x"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
"vows": ">= 0.5.8"
|
"vows": ">= 0.5.8"
|
||||||
},
|
},
|
||||||
"main": "./lib/nconf",
|
"main": "./lib/nconf",
|
||||||
|
|
|
@ -5,13 +5,11 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require.paths.unshift(require('path').join(__dirname, '..', 'lib'));
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
var fs = require('fs'),
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
vows = require('vows'),
|
vows = require('vows'),
|
||||||
assert = require('assert'),
|
assert = require('assert'),
|
||||||
nconf = require('nconf'),
|
nconf = require('../lib/nconf'),
|
||||||
data = require('./fixtures/data').data,
|
data = require('./fixtures/data').data,
|
||||||
store;
|
store;
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require.paths.unshift(require('path').join(__dirname, '..', 'lib'));
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
var vows = require('vows'),
|
||||||
assert = require('assert'),
|
assert = require('assert'),
|
||||||
nconf = require('nconf');
|
nconf = require('../lib/nconf');
|
||||||
|
|
||||||
vows.describe('nconf/stores/memory').addBatch({
|
vows.describe('nconf/stores/memory').addBatch({
|
||||||
"When using the nconf memory store": {
|
"When using the nconf memory store": {
|
||||||
|
|
|
@ -5,13 +5,11 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require.paths.unshift(require('path').join(__dirname, '..', 'lib'));
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
var fs = require('fs'),
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
vows = require('vows'),
|
vows = require('vows'),
|
||||||
assert = require('assert'),
|
assert = require('assert'),
|
||||||
nconf = require('nconf'),
|
nconf = require('../lib/nconf'),
|
||||||
data = require('./fixtures/data').data;
|
data = require('./fixtures/data').data;
|
||||||
|
|
||||||
vows.describe('nconf').addBatch({
|
vows.describe('nconf').addBatch({
|
||||||
|
|
|
@ -5,11 +5,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require.paths.unshift(require('path').join(__dirname, '..', 'lib'));
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
var vows = require('vows'),
|
||||||
assert = require('assert'),
|
assert = require('assert'),
|
||||||
nconf = require('nconf'),
|
nconf = require('../lib/nconf'),
|
||||||
data = require('./fixtures/data').data;
|
data = require('./fixtures/data').data;
|
||||||
|
|
||||||
vows.describe('nconf/stores/redis').addBatch({
|
vows.describe('nconf/stores/redis').addBatch({
|
||||||
|
|
4
usage.js
4
usage.js
|
@ -1,8 +1,6 @@
|
||||||
require.paths.unshift(require('path').join(__dirname, 'lib'));
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
var fs = require('fs'),
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
nconf = require('nconf');
|
nconf = require('./lib/nconf');
|
||||||
|
|
||||||
//
|
//
|
||||||
// Setup nconf to user the 'file' store and set a couple of values;
|
// Setup nconf to user the 'file' store and set a couple of values;
|
||||||
|
|
Loading…
Reference in a new issue