Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

From 618816f, implement interpolation of %([BLOCK.]KEY) #2

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 58 additions & 0 deletions index.js
Expand Up @@ -83,6 +83,22 @@ var inheritDefault = function(block, _default, key) {
return out; return out;
}; };


/**
* return a deep copy of the object o
*/
var deepCopy = function(o, c) {
var out = c || {};
for (var key in o) {
if (typeof o[key] === 'object') {
out[key] = (o[key].constructor === Array ? [] : {});
deepCopy(o[key], out[key]);
} else {
out[key] = o[key];
}
};
return out;
};



/** /**
* Parses a .ini file and convert's it's content to a JS object * Parses a .ini file and convert's it's content to a JS object
Expand Down Expand Up @@ -328,6 +344,48 @@ IniReader.prototype.param = function (prop, value) {
} }
}; };


IniReader.prototype.interpolate = function(param) {
var output = this.getParam(param),
block, key, refParams, refParam, references;
var self = this;

if (typeof output === 'object') {
output = deepCopy(output);
}

if (param) {
param = param.split('.');
block = param[0];
key = param[1];
}

if (typeof key == 'undefined' || !param) {
for (block in output) {
for (key in output[block]) {
output[block][key] = this.interpolate(block + '.' + key);
}
}
} else {
if (typeof output === 'string') {
references = output.match(/%\(.*?\)/g);
references && references.forEach(
function(reference) {
var refKey = reference.replace(/%\((.*?)\)/, '$1');
refParams = refKey.split('.');
if (refParams.length < 2) { // interpolation in current block
refParam = block + '.' + refParams[0];
} else {
refParam = refKey;
}
output = output.replace(reference, self.interpolate(refParam));
}
);
}
}

return output;
};

IniReader.prototype.getLe = function (le) { IniReader.prototype.getLe = function (le) {
return typeof le === 'string' && (le === '\n' || le === '\r\n' || le === '\r') ? le : '\n'; return typeof le === 'string' && (le === '\n' || le === '\r\n' || le === '\r') ? le : '\n';
}; };
Expand Down
6 changes: 5 additions & 1 deletion tests/ize-dos.ini
Expand Up @@ -8,11 +8,15 @@ lorem = ipsum
ipus = foo bar baz ipus = foo bar baz
dolor=sit dolor=sit
amet= amet=
interpolate=%(dolor)tercity
interpolate_default="%(test_default) / interpolation"
interpolate_block="%(bar.test_default) / block interpolation"


[bar] [bar]
asdfas=fooobar asdfas=fooobar
1="lorem ipsum" 1="lorem ipsum"
2=" lorem ipsum" 2=" lorem ipsum"
3='lorem ipsum' 3='lorem ipsum'
4='lorem ipsum ' 4='lorem ipsum '
test_default='I come from bar' test_default='I come from bar'
interpolate_block_recursive='%(foo.interpolate_block) / recursive'
2 changes: 1 addition & 1 deletion tests/ize-mac.ini
@@ -1 +1 @@
[DEFAULT]test_default="I come from the default section"[foo]lorem = ipsumipus = foo bar bazdolor=sitamet=[bar]asdfas=fooobar 1= "lorem ipsum"2=" lorem ipsum"3='lorem ipsum'4='lorem ipsum 'test_default='I come from bar' [DEFAULT]test_default="I come from the default section"[foo]lorem = ipsumipus = foo bar bazdolor=sitamet=interpolate=%(dolor)tercityinterpolate_default="%(test_default) / interpolation"interpolate_block="%(bar.test_default) / block interpolation"[bar]asdfas=fooobar 1= "lorem ipsum"2=" lorem ipsum"3='lorem ipsum'4='lorem ipsum 'test_default='I come from bar'interpolate_block_recursive='%(foo.interpolate_block) / recursive'
Expand Down
6 changes: 5 additions & 1 deletion tests/ize-unix.ini
Expand Up @@ -8,11 +8,15 @@ lorem = ipsum
ipus = foo bar baz ipus = foo bar baz
dolor=sit dolor=sit
amet= amet=
interpolate=%(dolor)tercity
interpolate_default='%(test_default) / interpolation'
interpolate_block="%(bar.test_default) / block interpolation"


[bar] [bar]
asdfas=fooobar asdfas=fooobar
1= "lorem ipsum" 1= "lorem ipsum"
2=" lorem ipsum" 2=" lorem ipsum"
3='lorem ipsum' 3='lorem ipsum'
4='lorem ipsum ' 4='lorem ipsum '
test_default='I come from bar' test_default='I come from bar'
interpolate_block_recursive='%(foo.interpolate_block) / recursive'
3 changes: 2 additions & 1 deletion tests/makefile
@@ -1,2 +1,3 @@
all: all:
node ./test.js node ./test.js
node ./test-old.js
114 changes: 66 additions & 48 deletions tests/test.js
Expand Up @@ -27,58 +27,76 @@
}; };


test = function (obj) { test = function (obj) {
assert.equal(typeof(obj.param()), 'object', ['param', 'interpolate'].forEach(function(fnGet) {
'empty key doesn\'t returned object'); assert.equal(typeof(obj[fnGet]()), 'object',
assert.equal(typeof(obj.param('doesntexists')), 'undefined', 'empty key doesn\'t returned object');
'nonexisting key doesn\'t returned undefined'); assert.equal(typeof(obj[fnGet]('doesntexists')), 'undefined',
assert.equal(typeof(obj.param('foo')), 'object', 'existing key doesn\'t returned an object'); 'nonexisting key doesn\'t returned undefined');
assert.equal(typeof(obj.param('bar')), 'object', 'existing key doesn\'t returned an object'); assert.equal(typeof(obj[fnGet]('foo')), 'object', 'existing key doesn\'t returned an object');

assert.equal(typeof(obj[fnGet]('bar')), 'object', 'existing key doesn\'t returned an object');
assert.deepEqual(obj.param('foo.lorem'),
'ipsum', 'lorem\'s key value in foo conf is not ipsum'); assert.deepEqual(obj[fnGet]('foo.lorem'),
assert.deepEqual(obj.param().foo.lorem, 'ipsum', 'lorem\'s key value in foo conf is not ipsum');
'ipsum', 'lorem\'s key value in foo conf is not ipsum'); assert.deepEqual(obj[fnGet]().foo.lorem,
assert.deepEqual(obj.param('foo.amet'), '', 'amet\'s value should be an empty string'); 'ipsum', 'lorem\'s key value in foo conf is not ipsum');
assert.equal(typeof(obj.param('foo.doesntexists')), assert.deepEqual(obj[fnGet]('foo.amet'), '', 'amet\'s value should be an empty string');
'undefined', 'value which should not exist returned something else then undefined'); assert.equal(typeof(obj[fnGet]('foo.doesntexists')),

'undefined', 'value which should not exist returned something else then undefined');


// Test of section "DEFAULT" {--
assert.deepEqual(obj.param('DEFAULT.test_default'), 'I come from the default section', // Test of section "DEFAULT" {--
'test_default\'s key value in DEFAULT is wrong' assert.deepEqual(obj[fnGet]('DEFAULT.test_default'), 'I come from the default section',
'test_default\'s key value in DEFAULT is wrong'
);

if (obj.inheritDefault) {
assert.deepEqual(obj[fnGet]('foo.test_default'), 'I come from the default section',
'test_default\'s key value in foo is not inherited from DEFAULT section'
);
assert.deepEqual(obj[fnGet]().foo.test_default, 'I come from the default section',
'test_default\'s key value in foo is not inherited from DEFAULT section'
);
[obj[fnGet]().foo.test_default, obj[fnGet]('foo.test_default')].forEach(
function(_) {
assert.deepEqual(_, 'I come from the default section', ''
+ 'test_default\'s key value in foo is'
+ ' not inherited from DEFAULT section'
);}
);
[obj[fnGet]().bar.test_default, obj[fnGet]('bar.test_default')].forEach(
function(_) {assert.deepEqual(_, 'I come from bar',
'test_default\'s key value in bar is not overwrited');}
);
} else {
assert.equal(typeof(obj[fnGet]('foo.test_default')), 'undefined',
'value which should not exist returned something else then undefined'
); );
}
// --}


if (obj.inheritDefault) {
assert.deepEqual(obj.param('foo.test_default'), 'I come from the default section',
'test_default\'s key value in foo is not inherited from DEFAULT section'
);
assert.deepEqual(obj.param().foo.test_default, 'I come from the default section',
'test_default\'s key value in foo is not inherited from DEFAULT section'
);
[obj.param().foo.test_default, obj.param('foo.test_default')].forEach(
function(_) {
assert.deepEqual(_, 'I come from the default section', ''
+ 'test_default\'s key value in foo is'
+ ' not inherited from DEFAULT section'
);}
);
[obj.param().bar.test_default, obj.param('bar.test_default')].forEach(
function(_) {assert.deepEqual(_, 'I come from bar',
'test_default\'s key value in bar is not overwrited');}
);
} else {
assert.equal(typeof(obj.param('foo.test_default')), 'undefined',
'value which should not exist returned something else then undefined'
);
}
// --}


assert.deepEqual(obj[fnGet]('bar.asdfas'), 'fooobar', 'bad value');
assert.deepEqual(obj[fnGet]('bar.1'), 'lorem ipsum');
assert.deepEqual(obj[fnGet]('bar.2'), ' lorem ipsum');
assert.deepEqual(obj[fnGet]('bar.3'), 'lorem ipsum');
assert.deepEqual(obj[fnGet]('bar.4'), 'lorem ipsum ');
});


assert.deepEqual(obj.param('bar.asdfas'), 'fooobar', 'bad value'); // Test the interpolations {--
assert.deepEqual(obj.param('bar.1'), 'lorem ipsum'); assert.deepEqual(obj.interpolate('foo.interpolate'), 'sittercity', 'Interpolation is wrong');
assert.deepEqual(obj.param('bar.2'), ' lorem ipsum'); if (obj.inheritDefault) {
assert.deepEqual(obj.param('bar.3'), 'lorem ipsum'); assert.deepEqual(obj.interpolate('foo.interpolate_default'),
assert.deepEqual(obj.param('bar.4'), 'lorem ipsum '); 'I come from the default section / interpolation',
'Interpolation with inheritance from block "DEFAULT" is wrong');
assert.deepEqual(obj.interpolate('bar.interpolate_block_recursive'),
'I come from bar / block interpolation / recursive',
'Interpolation wiht inheritance from block "DEFAULT" and recursion is wrong');
}
assert.deepEqual(obj.interpolate('foo.interpolate_block'),
'I come from bar / block interpolation',
'Interpolation from other block is wrong');

// --}
}; };




Expand Down