From e81b9c6d33027e4545f6c828fc45c1342fb5d008 Mon Sep 17 00:00:00 2001 From: tkrause Date: Mon, 18 May 2020 16:30:51 +0200 Subject: [PATCH 1/9] enable the use of an apiUse block in an apiDefine block --- lib/parser.js | 3 +- lib/workers/api_use.js | 113 +++++++++++++++++++++++------------------ 2 files changed, 65 insertions(+), 51 deletions(-) diff --git a/lib/parser.js b/lib/parser.js index 974e416..e041db6 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -222,7 +222,8 @@ Parser.prototype._parseBlockElements = function(indexApiBlocks, detectedElements preventGlobal = elementParser.preventGlobal === true; // allow multiple inserts into pathTo - allowMultiple = elementParser.allowMultiple === true; + //allowMultiple = elementParser.allowMultiple === true; + allowMultiple = true; // path to an array, where the values should be attached diff --git a/lib/workers/api_use.js b/lib/workers/api_use.js index ca206cd..80307bb 100644 --- a/lib/workers/api_use.js +++ b/lib/workers/api_use.js @@ -66,70 +66,83 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t parsedFiles.forEach(function(parsedFile, parsedFileIndex) { parsedFile.forEach(function(block) { - if ( ! block.local[target]) - return; - - block.local[target].forEach(function(definition) { - var name = definition.name; - var version = block.version || packageInfos.defaultVersion; - - if ( ! preProcess[source] || ! preProcess[source][name]) { - throw new WorkerError('Referenced groupname does not exist / it is not defined with @apiDefine.', - filenames[parsedFileIndex], - block.index, - messages.common.element, - messages.common.usage, - messages.common.example, - [ - { 'Groupname': name } - ] + var loopCounter = 0; //add a loop counter to have a break condition when the recursion depth exceed a predifined limit + while (block.local[target]) { + if (loopCounter > 10) { + throw new WorkerError('recursion depth exceeds limit with @apiUse', + filenames[parsedFileIndex], + block.index, + messages.common.element, + messages.common.usage, + messages.common.example, + [ + { 'Groupname': name } + ] ); - } - - var matchedData = {}; - if (preProcess[source][name][version]) { - // found the version - matchedData = preProcess[source][name][version]; - } else { - // find nearest matching version - var foundIndex = -1; - var lastVersion = packageInfos.defaultVersion; - - var versionKeys = Object.keys(preProcess[source][name]); - versionKeys.forEach(function(currentVersion, versionIndex) { - if (semver.gte(version, currentVersion) && semver.gte(currentVersion, lastVersion)) { - lastVersion = currentVersion; - foundIndex = versionIndex; - } - }); + } + + block.local[target].forEach(function(definition) { + var name = definition.name; + var version = block.version || packageInfos.defaultVersion; - if (foundIndex === -1) { - throw new WorkerError('Referenced definition has no matching or a higher version. ' + - 'Check version number in referenced define block.', + if ( ! preProcess[source] || ! preProcess[source][name]) { + throw new WorkerError('Referenced groupname does not exist / it is not defined with @apiDefine.', filenames[parsedFileIndex], block.index, messages.common.element, messages.common.usage, messages.common.example, [ - { 'Groupname': name }, - { 'Version': version }, - { 'Defined versions': versionKeys }, + { 'Groupname': name } ] ); } - var versionName = versionKeys[foundIndex]; - matchedData = preProcess[source][name][versionName]; - } + var matchedData = {}; + if (preProcess[source][name][version]) { + // found the version + matchedData = preProcess[source][name][version]; + } else { + // find nearest matching version + var foundIndex = -1; + var lastVersion = packageInfos.defaultVersion; + + var versionKeys = Object.keys(preProcess[source][name]); + versionKeys.forEach(function(currentVersion, versionIndex) { + if (semver.gte(version, currentVersion) && semver.gte(currentVersion, lastVersion)) { + lastVersion = currentVersion; + foundIndex = versionIndex; + } + }); + + if (foundIndex === -1) { + throw new WorkerError('Referenced definition has no matching or a higher version. ' + + 'Check version number in referenced define block.', + filenames[parsedFileIndex], + block.index, + messages.common.element, + messages.common.usage, + messages.common.example, + [ + { 'Groupname': name }, + { 'Version': version }, + { 'Defined versions': versionKeys }, + ] + ); + } + + var versionName = versionKeys[foundIndex]; + matchedData = preProcess[source][name][versionName]; + } - // remove target, not needed anymore - // TODO: create a cleanup filter - delete block.local[target]; + // remove target, not needed anymore + // TODO: create a cleanup filter + delete block.local[target]; - // copy matched elements into parsed block - _recursiveMerge(block.local, matchedData); - }); + // copy matched elements into parsed block + _recursiveMerge(block.local, matchedData); + }); + } }); }); } From ad4d02bedf1af62c09d9eafe28ccc1205488a5d4 Mon Sep 17 00:00:00 2001 From: tkrause Date: Tue, 19 May 2020 15:52:36 +0200 Subject: [PATCH 2/9] bugfix: the array was modified while iterating --- lib/workers/api_use.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/workers/api_use.js b/lib/workers/api_use.js index 80307bb..43ff2d6 100644 --- a/lib/workers/api_use.js +++ b/lib/workers/api_use.js @@ -80,8 +80,15 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t ] ); } + + //create a copy of the elements for save iterating of the elements + const blockClone = [...block.local[target]]; - block.local[target].forEach(function(definition) { + // remove unneeded target before starting the loop, to allow a save insertion of new elements + // TODO: create a cleanup filter + delete block.local[target]; + + blockClone.forEach(function(definition) { var name = definition.name; var version = block.version || packageInfos.defaultVersion; @@ -135,10 +142,6 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t matchedData = preProcess[source][name][versionName]; } - // remove target, not needed anymore - // TODO: create a cleanup filter - delete block.local[target]; - // copy matched elements into parsed block _recursiveMerge(block.local, matchedData); }); From e1fb8d1c4a53048468b6575d6c1239503eeb45d6 Mon Sep 17 00:00:00 2001 From: tommy87 Date: Thu, 28 May 2020 14:42:12 +0200 Subject: [PATCH 3/9] remove old commented code --- lib/parser.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/parser.js b/lib/parser.js index e041db6..4234293 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -222,7 +222,6 @@ Parser.prototype._parseBlockElements = function(indexApiBlocks, detectedElements preventGlobal = elementParser.preventGlobal === true; // allow multiple inserts into pathTo - //allowMultiple = elementParser.allowMultiple === true; allowMultiple = true; From be8ed6db6f104bde3802611f2c067599fc03d7a2 Mon Sep 17 00:00:00 2001 From: tommy87 Date: Thu, 28 May 2020 14:54:33 +0200 Subject: [PATCH 4/9] replaced tabs by 4 spaces indent --- lib/workers/api_use.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/workers/api_use.js b/lib/workers/api_use.js index 43ff2d6..63c2161 100644 --- a/lib/workers/api_use.js +++ b/lib/workers/api_use.js @@ -67,19 +67,19 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t parsedFiles.forEach(function(parsedFile, parsedFileIndex) { parsedFile.forEach(function(block) { var loopCounter = 0; //add a loop counter to have a break condition when the recursion depth exceed a predifined limit - while (block.local[target]) { - if (loopCounter > 10) { - throw new WorkerError('recursion depth exceeds limit with @apiUse', - filenames[parsedFileIndex], - block.index, - messages.common.element, - messages.common.usage, - messages.common.example, - [ - { 'Groupname': name } - ] + while (block.local[target]) { + if (loopCounter > 10) { + throw new WorkerError('recursion depth exceeds limit with @apiUse', + filenames[parsedFileIndex], + block.index, + messages.common.element, + messages.common.usage, + messages.common.example, + [ + { 'Groupname': name } + ] ); - } + } //create a copy of the elements for save iterating of the elements const blockClone = [...block.local[target]]; From 65d07df7f256f748a0d8337f1a2915c7ba56e688 Mon Sep 17 00:00:00 2001 From: tkrause Date: Sat, 13 Jun 2020 10:44:41 +0200 Subject: [PATCH 5/9] - fix jshint errors - replace tabs by spaces --- lib/workers/api_use.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/workers/api_use.js b/lib/workers/api_use.js index 43ff2d6..3f2c595 100644 --- a/lib/workers/api_use.js +++ b/lib/workers/api_use.js @@ -67,28 +67,29 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t parsedFiles.forEach(function(parsedFile, parsedFileIndex) { parsedFile.forEach(function(block) { var loopCounter = 0; //add a loop counter to have a break condition when the recursion depth exceed a predifined limit - while (block.local[target]) { - if (loopCounter > 10) { - throw new WorkerError('recursion depth exceeds limit with @apiUse', - filenames[parsedFileIndex], - block.index, - messages.common.element, - messages.common.usage, - messages.common.example, - [ - { 'Groupname': name } - ] + while (block.local[target]) { + if (loopCounter > 10) { + throw new WorkerError('recursion depth exceeds limit with @apiUse', + filenames[parsedFileIndex], + block.index, + messages.common.element, + messages.common.usage, + messages.common.example, + [ + { 'Groupname': block.name } + ] ); - } + } //create a copy of the elements for save iterating of the elements - const blockClone = [...block.local[target]]; + var blockClone = block.local[target].slice(); // remove unneeded target before starting the loop, to allow a save insertion of new elements // TODO: create a cleanup filter delete block.local[target]; - blockClone.forEach(function(definition) { + for (var blockIndex = 0; blockIndex < blockClone.length; ++blockIndex) { + var definition = blockClone[blockIndex]; var name = definition.name; var version = block.version || packageInfos.defaultVersion; @@ -115,12 +116,13 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t var lastVersion = packageInfos.defaultVersion; var versionKeys = Object.keys(preProcess[source][name]); - versionKeys.forEach(function(currentVersion, versionIndex) { + for (var versionIndex = 0; versionIndex < versionKeys.length; ++versionIndex) { + var currentVersion = versionKeys[versionIndex]; if (semver.gte(version, currentVersion) && semver.gte(currentVersion, lastVersion)) { lastVersion = currentVersion; foundIndex = versionIndex; } - }); + } if (foundIndex === -1) { throw new WorkerError('Referenced definition has no matching or a higher version. ' + @@ -144,7 +146,7 @@ function postProcess(parsedFiles, filenames, preProcess, packageInfos, source, t // copy matched elements into parsed block _recursiveMerge(block.local, matchedData); - }); + } } }); }); From b624a23d1d5855756c56df7b1ef642c486b46d60 Mon Sep 17 00:00:00 2001 From: tkrause Date: Sat, 13 Jun 2020 10:55:29 +0200 Subject: [PATCH 6/9] fix previous existing jshint error --- lib/parsers/api_private.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parsers/api_private.js b/lib/parsers/api_private.js index cce67d1..71e540b 100644 --- a/lib/parsers/api_private.js +++ b/lib/parsers/api_private.js @@ -1,4 +1,4 @@ -function parse(content) { +function parse() { return 'private'; } From 3a9d2f7e8bca084ef76f7e53873e87519b0e591a Mon Sep 17 00:00:00 2001 From: tkrause Date: Sat, 13 Jun 2020 15:31:43 +0200 Subject: [PATCH 7/9] add simple test --- test/worker_api_use_test.js | 78 +++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 test/worker_api_use_test.js diff --git a/test/worker_api_use_test.js b/test/worker_api_use_test.js new file mode 100644 index 0000000..a9908cc --- /dev/null +++ b/test/worker_api_use_test.js @@ -0,0 +1,78 @@ +/*jshint unused:false*/ + +/** + * Test: Parser apiParam + */ + +// node modules +var should = require('should'); + +// lib modules +var worker = require('../lib/workers/api_use'); + +describe('Worker: apiUse', function() { + + var packageInfos = { + name: 'Test recursive apiUse', + version: '0.0.1', + description: 'i am a dummy description', + title: 'Test recursive apiUse', + url: 'http://localhost:18080', + order: [ 'GetUser', 'PostUser' ], + template: { withCompare: false, withGenerator: true }, + sampleUrl: false, + defaultVersion: '0.0.0' + }; + + var filenames = [ 'fileA', 'fileB', 'fileC' ]; + + // TODO: Add 1.000 more possible cases ;-) + var parsedFilesSimpleTest = [ + //file + [ + { + global: { }, + local: { + use: [ + { name: 'leaf_l' } + ], + name: 'root', + test: ['root'] + }, + expected: 'root', + index: 2 + }, + { + global: { + define: { + name: 'leaf_l', + title: '', + description: '', + } + }, + local: { + test: ['l'] + }, + index: 1, + expected: 'l' + } + ] + ]; + + // create + it('case 1: simple test', function(done) { + var preProcess = worker.preProcess(parsedFilesSimpleTest, filenames, packageInfos); + worker.postProcess(parsedFilesSimpleTest, filenames, preProcess, packageInfos); + + var rootBlock = parsedFilesSimpleTest[0][0]; + rootBlock.local.name.should.eql('root'); + + parsedFilesSimpleTest.forEach(function(parsedFile, parsedFileIndex) { + parsedFile.forEach(function(block) { + rootBlock.local.test.should.containEql(block.expected); + }); + }); + done(); + }); + +}); From 8623dc74e7526f33e80b0a9074a611b90e2c1680 Mon Sep 17 00:00:00 2001 From: tkrause Date: Sat, 13 Jun 2020 15:47:19 +0200 Subject: [PATCH 8/9] add complex recursiv test --- test/worker_api_use_test.js | 139 +++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 2 deletions(-) diff --git a/test/worker_api_use_test.js b/test/worker_api_use_test.js index a9908cc..8bf5366 100644 --- a/test/worker_api_use_test.js +++ b/test/worker_api_use_test.js @@ -27,6 +27,9 @@ describe('Worker: apiUse', function() { var filenames = [ 'fileA', 'fileB', 'fileC' ]; // TODO: Add 1.000 more possible cases ;-) + // the tree is build like + // root + // l var parsedFilesSimpleTest = [ //file [ @@ -40,7 +43,6 @@ describe('Worker: apiUse', function() { test: ['root'] }, expected: 'root', - index: 2 }, { global: { @@ -53,12 +55,126 @@ describe('Worker: apiUse', function() { local: { test: ['l'] }, - index: 1, expected: 'l' } ] ]; + // the tree is build like + // root + // l, r + // ll, rr + // rrl, rrr + var parsedFilesRecursiveTest = [ + //file + [ + { + global: { }, + local: { + use: [ + { name: 'leaf_l' }, + { name: 'leaf_r' }, + ], + name: 'root', + test: ['root'] + }, + expected: 'root', + } + ], + [ + { + global: { + define: { + name: 'leaf_l', + title: '', + description: '', + } + }, + local: { + test: ['l'], + use: [ + { name: 'leaf_ll' } + ], + }, + expected: 'l' + }, + { + global: { + define: { + name: 'leaf_rr', + title: '', + description: '', + } + }, + local: { + test: ['rr'], + use: [ + { name: 'leaf_rrr' }, + { name: 'leaf_rrl' } + ], + }, + expected: 'rr' + } + ], + [ + { + global: { + define: { + name: 'leaf_ll', + title: '', + description: '', + } + }, + local: { + test: ['ll'] + }, + expected: 'll' + }, + { + global: { + define: { + name: 'leaf_r', + title: '', + description: '', + } + }, + local: { + test: ['r'], + use: [ + { name: 'leaf_rr' } + ], + }, + expected: 'r' + }, + { + global: { + define: { + name: 'leaf_rrr', + title: '', + description: '', + } + }, + local: { + test: ['rrr'] + }, + expected: 'rrr' + }, + { + global: { + define: { + name: 'leaf_rrl', + title: '', + description: '', + } + }, + local: { + test: ['rrl'] + }, + expected: 'rrl' + } + ] + ]; + // create it('case 1: simple test', function(done) { var preProcess = worker.preProcess(parsedFilesSimpleTest, filenames, packageInfos); @@ -67,6 +183,7 @@ describe('Worker: apiUse', function() { var rootBlock = parsedFilesSimpleTest[0][0]; rootBlock.local.name.should.eql('root'); + //check if the root block contains the expected value from every other block parsedFilesSimpleTest.forEach(function(parsedFile, parsedFileIndex) { parsedFile.forEach(function(block) { rootBlock.local.test.should.containEql(block.expected); @@ -75,4 +192,22 @@ describe('Worker: apiUse', function() { done(); }); + it('case 2: recursive test', function(done) { + var preProcess = worker.preProcess(parsedFilesRecursiveTest, filenames, packageInfos); + worker.postProcess(parsedFilesRecursiveTest, filenames, preProcess, packageInfos); + + var rootBlock = parsedFilesRecursiveTest[0][0]; + rootBlock.local.name.should.eql('root'); + + //console.log(rootBlock); + + //check if the root block contains the expected value from every other block + parsedFilesRecursiveTest.forEach(function(parsedFile, parsedFileIndex) { + parsedFile.forEach(function(block) { + rootBlock.local.test.should.containEql(block.expected); + }); + }); + done(); + }); + }); From fd3777f77600debb7399b17fda4aa7eecb01f17f Mon Sep 17 00:00:00 2001 From: tkrause Date: Sat, 15 Aug 2020 10:32:58 +0200 Subject: [PATCH 9/9] remove commented code --- test/worker_api_use_test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/worker_api_use_test.js b/test/worker_api_use_test.js index 8bf5366..4418028 100644 --- a/test/worker_api_use_test.js +++ b/test/worker_api_use_test.js @@ -199,8 +199,6 @@ describe('Worker: apiUse', function() { var rootBlock = parsedFilesRecursiveTest[0][0]; rootBlock.local.name.should.eql('root'); - //console.log(rootBlock); - //check if the root block contains the expected value from every other block parsedFilesRecursiveTest.forEach(function(parsedFile, parsedFileIndex) { parsedFile.forEach(function(block) {