diff --git a/packages/contract-cli/package.json b/packages/contract-cli/package.json index e60600772d335f9f6d2678b0f4361650405a3239..d97879a1b9e1e3fed7ec9eb1cb900a52dc6df425 100755 --- a/packages/contract-cli/package.json +++ b/packages/contract-cli/package.json @@ -16,7 +16,7 @@ "cli": "DEBUG=jsonql-contract* node ./cli.js", "cli:watch": "DEBUG=jsonql-contract* node ./watch.js", "test:cli": "npm run cli configFile ./tests/fixtures/cmd-config-test.js", - "test": "DEBUG=jsonql-contract:jsdoc-api ava", + "test": "ava --verbose", "test:doc": "DEBUG=jsonql-contract:* ava ./tests/contract-with-doc.test.js", "test:gen": "DEBUG=jsonql-contract:* ava ./tests/generator.test.js", "test:path": "DEBUG=jsonql-contract:* ava tests/paths.test.js", diff --git a/packages/contract-cli/src/generator/get-resolver.js b/packages/contract-cli/src/generator/get-resolver.js index ed0235d2bf189b6724201bee83a8069a5bb5cfe9..3a67ed1fbb0d4f7a72a8087bdd64d2ad74175887 100644 --- a/packages/contract-cli/src/generator/get-resolver.js +++ b/packages/contract-cli/src/generator/get-resolver.js @@ -43,7 +43,7 @@ const sourceFileType = src => { } /** - * try to find out the resourceType until we find it + * Try to find out the resourceType until we find it * @param {array} objs array of objs * @return {object} add the resourceType to the object */ diff --git a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js index 6b3707c720779bb01430edc8475b54a5eedcedf6..3cb30fb6742ef2b165e8205f0199cf17ee4268f9 100644 --- a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js +++ b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js @@ -1,16 +1,17 @@ // this will take the input files list then check if this is a resolver - +const { getResolver } = require('../get-resolver') /** * The process listener * @param {object} payload the complete payload - * @param {number} payload.idx the index of this process - * @param {string} payload.processor the name of the processor - * @param {array} payload.args the argument pass to the processor + * @param {function} payload.preprocessor the name of the processor + * @param {string} payload.file the argument pass to the processor * @return {void} just use process.send back the idx, processor and result */ -process.on('message', ({ idx, processor, args }) => { - Reflect.apply(fn[processor], null, args) +process.on('message', ({file, inDir, fileType, config}) => { + const preprocessor = getResolver(inDir, fileType, config) + Reflect.apply(preprocessor, null, [file]) .then(result => { - process.send({ idx, processor, result}) + // send the result straight back + process.send(result) }) }) diff --git a/packages/contract-cli/src/generator/process-file.js b/packages/contract-cli/src/generator/process-file.js index f02af34c495b66166f2aa3070bde40d49358f9e1..6f5335b13dd88c89aa192c8efad7d8a19384b2b1 100644 --- a/packages/contract-cli/src/generator/process-file.js +++ b/packages/contract-cli/src/generator/process-file.js @@ -18,11 +18,8 @@ const debug = getDebug('process-file') * wrapper method to call the pre splitTask * */ -function callPreSplitTask(_files, _preprocessor) { - return splitTask('pre', { - files: _files, - preprocessor: _preprocessor - }) +function callPreSplitTask(inDir, fileType, files, config) { + return splitTask('pre', { inDir, fileType, files, config }) } /** @@ -43,13 +40,17 @@ function callPostSplitTask(_sourceType, _files, _config) { * @param {function} preprocessor for capture the resolver * @return {array} resolver objects */ -function processFilesAction(_files, _preprocessor) { - return callPreSplitTask(_files, _preprocessor) - .then(result => ( - result || _files.map( _preprocessor ) +function processFilesAction(inDir, fileType, files, config) { + return callPreSplitTask(inDir, fileType, files, config) + .then(result => { + if (result === false) { + const preprocessor = getResolver(inDir, fileType, config) + return files.map( preprocessor ) .filter( obj => obj.ok ) - .reduce( (n, m) => [...n, m], []) - )) + .reduce( (n, m) => [...n, m], []) // do we need this? + } + return result; + }) } /** @@ -60,10 +61,8 @@ function processFilesAction(_files, _preprocessor) { * @param {object} config options * @return {array} of preprocessed filtered resolver */ -function preprocessResolverFile(inDir, fileType, _files, config) { - const preprocessor = getResolver(inDir, fileType, config) - - return processFilesAction(_files, preprocessor) +function preprocessResolverFile(inDir, fileType, files, config) { + return processFilesAction(inDir, fileType, files, config) .then(objs => [ getSourceType(objs), objs diff --git a/packages/contract-cli/src/generator/split-task.js b/packages/contract-cli/src/generator/split-task.js index d8031c00c9a6455cfd6f212733c890072e673d20..0f0d258efea3d12b49fb3918c96a411c8f493e75 100644 --- a/packages/contract-cli/src/generator/split-task.js +++ b/packages/contract-cli/src/generator/split-task.js @@ -55,9 +55,9 @@ function createTask(slots, taskPath, payloads, returnType = true) { end = taskCtn; } matrix.push( - chainPromises(payloads.slice(begin, end).map(payload => { + chainPromises(payloads.slice(begin, end).map(payload => ( executeTask(taskPath, payload) - }), returnType) + )), returnType) ) } // now futher process the final matrix @@ -71,10 +71,13 @@ function createTask(slots, taskPath, payloads, returnType = true) { * @return {promise} resolve the final result */ function splitTask(taskName, payload) { + // disable this for now @TODO + return Promise.resolve(false) + const slots = getSlots() if ((slots > 0) === false) { console.error(`Sorry your system does NOT support multi processing!`) - return false; + return Promise.resolve(false) } let returnType = true; let scriptName, postProcessor; @@ -93,9 +96,14 @@ function splitTask(taskName, payload) { returnType = false; // default is array scriptName = 'preprocess-resolver' // here we need to get a preprocessor, then we don't need to keep calling it - let { files, preprocessor } = payload; - payloads = files.map(file => ({ file, preprocessor })) + // can not send a function as arument to the fork fn + let { inDir, fileType, files } = payload; + // debug(preprocessor, files) + payloads = files.map(file => ({ file, inDir, fileType, config: payload.config })) postProcessor = result => { + // should be running the fitler here + // return result.filter(obj => obj.ok) + debug('postProcessor', result) // run the filter here return result; } diff --git a/packages/contract-cli/tests/split-task.test.js b/packages/contract-cli/tests/split-task.test.js index ebf6bc27f4604686f7127fdbe7f11466945b00f0..cb620b7036b4057ca64d8ac7348c1b865067921d 100644 --- a/packages/contract-cli/tests/split-task.test.js +++ b/packages/contract-cli/tests/split-task.test.js @@ -1,12 +1,20 @@ // TDD to build the split task with cpu load caculcation and multiple // array of promises const test = require('ava') +const { join } = require('path') const { chainPromises } = require('jsonql-utils') const os = require('os') const debug = require('debug')('jsonql-contract:test:split') // import method frr testing -const { getResolverFiles } +const { getResolverFiles } = require('../src/generator/read-files-out-contract') +const { splitTask } = require('../src/generator/split-task') +const { + getResolver, + getSourceType, + getContractBase +} = require('../src/generator/get-resolver') +const resolverDir = join(__dirname, 'fixtures', 'koa-resolvers') function randomIntFromInterval(min, max) { // min and max included return Math.floor(Math.random() * (max - min + 1) + min); @@ -64,3 +72,14 @@ test.cb(`Should able to create multple array based on the cpu available`, t => { t.end() }) }) + +test.cb(`It should able to split the task and return an array`, t => { + t.plan(1) + // need to get a config object + getResolverFiles(resolverDir) + .then(files => { + // prepare the payloads + t.truthy(files.length) + t.end() + }) +})