From 2b602fbde98c578ea46286019e50617c02ff2e4d Mon Sep 17 00:00:00 2001 From: joelchu Date: Thu, 3 Oct 2019 15:53:32 +0800 Subject: [PATCH 1/3] mapping the pre split task --- .../src/generator/get-resolver.js | 2 +- .../generator/hamsters/preprocess-resolver.js | 12 +++++------ .../contract-cli/src/generator/split-task.js | 5 +++-- .../contract-cli/tests/split-task.test.js | 21 ++++++++++++++++++- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/contract-cli/src/generator/get-resolver.js b/packages/contract-cli/src/generator/get-resolver.js index ed0235d2..3a67ed1f 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 6b3707c7..f6e451c5 100644 --- a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js +++ b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js @@ -3,14 +3,14 @@ /** * 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, preprocessor }) => { + 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/split-task.js b/packages/contract-cli/src/generator/split-task.js index d8031c00..0c1bc100 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 @@ -96,6 +96,7 @@ function splitTask(taskName, payload) { let { files, preprocessor } = payload; payloads = files.map(file => ({ file, preprocessor })) postProcessor = result => { + 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 ebf6bc27..52ab4e0d 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-file-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() + }) +}) -- Gitee From a840d82cfaedc70844079b4da78dc24b43f15261 Mon Sep 17 00:00:00 2001 From: joelchu Date: Thu, 3 Oct 2019 16:14:13 +0800 Subject: [PATCH 2/3] disable the split task for now --- packages/contract-cli/package.json | 2 +- .../generator/hamsters/preprocess-resolver.js | 5 ++-- .../src/generator/process-file.js | 29 +++++++++---------- .../contract-cli/src/generator/split-task.js | 13 +++++++-- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/packages/contract-cli/package.json b/packages/contract-cli/package.json index 9547cf95..51560e16 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/hamsters/preprocess-resolver.js b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js index f6e451c5..3cb30fb6 100644 --- a/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js +++ b/packages/contract-cli/src/generator/hamsters/preprocess-resolver.js @@ -1,5 +1,5 @@ // 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 @@ -7,7 +7,8 @@ * @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', ({ file, preprocessor }) => { +process.on('message', ({file, inDir, fileType, config}) => { + const preprocessor = getResolver(inDir, fileType, config) Reflect.apply(preprocessor, null, [file]) .then(result => { // send the result straight back diff --git a/packages/contract-cli/src/generator/process-file.js b/packages/contract-cli/src/generator/process-file.js index f02af34c..6f5335b1 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 0c1bc100..0f0d258e 100644 --- a/packages/contract-cli/src/generator/split-task.js +++ b/packages/contract-cli/src/generator/split-task.js @@ -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,13 @@ 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; -- Gitee From bdfe6dee47f9872f425549ae8f2df4133039f6f3 Mon Sep 17 00:00:00 2001 From: joelchu Date: Thu, 3 Oct 2019 16:15:45 +0800 Subject: [PATCH 3/3] test all passed for now --- packages/contract-cli/tests/split-task.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contract-cli/tests/split-task.test.js b/packages/contract-cli/tests/split-task.test.js index 52ab4e0d..cb620b70 100644 --- a/packages/contract-cli/tests/split-task.test.js +++ b/packages/contract-cli/tests/split-task.test.js @@ -6,7 +6,7 @@ const { chainPromises } = require('jsonql-utils') const os = require('os') const debug = require('debug')('jsonql-contract:test:split') // import method frr testing -const { getResolverFiles } = require('../src/generator/read-file-out-contract') +const { getResolverFiles } = require('../src/generator/read-files-out-contract') const { splitTask } = require('../src/generator/split-task') const { getResolver, @@ -75,7 +75,7 @@ test.cb(`Should able to create multple array based on the cpu available`, t => { test.cb(`It should able to split the task and return an array`, t => { t.plan(1) - // need to get a config object + // need to get a config object getResolverFiles(resolverDir) .then(files => { // prepare the payloads -- Gitee