theprogrammablemind 8.0.0-beta.61 → 8.0.0-beta.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client.js +472 -462
- package/package.json +1 -1
- package/src/config.js +20 -0
package/client.js
CHANGED
@@ -1080,6 +1080,7 @@ const knowledgeModuleImpl = async ({
|
|
1080
1080
|
config : configStruct,
|
1081
1081
|
api,
|
1082
1082
|
initializer,
|
1083
|
+
terminator,
|
1083
1084
|
multiApiInitializer,
|
1084
1085
|
|
1085
1086
|
module: moduleFromJSFile,
|
@@ -1111,6 +1112,7 @@ const knowledgeModuleImpl = async ({
|
|
1111
1112
|
|
1112
1113
|
const createConfig = async () => {
|
1113
1114
|
const config = new Config(configStruct, moduleFromJSFile, _process)
|
1115
|
+
config.setTerminator(terminator)
|
1114
1116
|
config.stop_auto_rebuild()
|
1115
1117
|
await config.add(...(includes || []))
|
1116
1118
|
if (api) {
|
@@ -1158,547 +1160,555 @@ const knowledgeModuleImpl = async ({
|
|
1158
1160
|
}
|
1159
1161
|
|
1160
1162
|
if (isProcess) {
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1163
|
+
let config
|
1164
|
+
try {
|
1165
|
+
const parser = new runtime.ArgumentParser({
|
1166
|
+
description: 'Entodicton knowledge module'
|
1167
|
+
})
|
1164
1168
|
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1169
|
+
const helpDebugWord = 'In order to get a debug break when a specific word is created set the DEBUG_WORD environment variable to the JSON of the association to break on. For example DEBUG_WORD=\'"the"\''
|
1170
|
+
const helpDebugAssociation = 'In order to get a debug break when a specific association is created set the DEBUG_ASSOCIATION environment variable to the JSON of the association to break on. For example DEBUG_ASSOCIATION=\'[["the", 0], ["mammal", 1]]\''
|
1171
|
+
const helpDebugHierarchy = 'In order to get a debug break when a specific hierarchy is created set the DEBUG_HIERARCHY environment variable to the JSON of the child-parent pair to break on. For example DEBUG_HIERARCHY=\'[["cat", 1], ["mammel", 1]]\''
|
1172
|
+
const helpDebugPriority = 'In order to get a debug break when a specific set of priorities is created set set DEBUG_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_PRIORITY=\'[["verb", 0], ["article", 0]]\''
|
1173
|
+
const helpDebugContextualPriority = 'In order to get a debug break when a specific set of contextual priorities is created set set DEBUG_CONTEXTUAL_PRIORITY environment variable to the JSON of the priorities that you want to break on. For example DEBUG_CONTEXTUAL_PRIORITY=\'{ context: [["verb", 0], ["article", 0], select: 1}\''
|
1174
|
+
const helpDebugBridge = 'In order to get a debug break when a specific bridge is created set the DEBUG_BRIDGE environment variable to id to break on. For example DEBUG_BRIDGE=\'car\''
|
1175
|
+
const helpDebugOperator = 'In order to get a debug break when a specific hierarcy is created set the DEBUG_OPERATOR environment variable to debug any config loaded. For example DEBUG_OPERATOR=\'([operator] ([arg]))\''
|
1176
|
+
|
1177
|
+
parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
|
1178
|
+
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1179
|
+
parser.add_argument('-tv', '--testVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. Create tests by running with the --query or --loop with the --save flag' })
|
1180
|
+
// parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
|
1181
|
+
parser.add_argument('-tva', '--testAllVerbose', { action: 'store_true', help: 'Run the tests in verbose mode. All the tests will be run instead of stopping at first failure. Create tests by running with the --query or --loop with the --save flag. if -q is specified the tests will be run for just the specified query.' })
|
1182
|
+
parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
|
1183
|
+
parser.add_argument('-n', '--count', { help: 'Number of times to run the tests. Default is one. Use this to check for flakey test. If possible the system will print out a message with the word "hint" suggesting how to fix the problem' })
|
1184
|
+
// parser.add_argument('-b', '--build', { help: 'Specify the template file name of the form <kmName>. There should be a file called <baseKmName>.<kmName>.template.json with the queries to run. For example { queries: [...] }. The template file will be run and generate an instantiation called <baseKmName>.<kmName>.instance.json and a file called <kmName>.js that will load the template file (this is file generated only if not already existing) and a test file called <KmName>.tests.json. This can then be loaded into an instance of the current knowledge module to setup initial conditions.' })
|
1185
|
+
parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild. Using optimization where if the query/config has not changed it will use the previous value. One there is a change all subsequence query/configs will be run.' })
|
1186
|
+
parser.add_argument('-rtf', '--rebuildTemplateFull', { action: 'store_true', help: 'Force a template rebuild. Skip the optimization' })
|
1187
|
+
parser.add_argument('-l', '--loop', { action: 'store_true', help: 'Run a loop so that multiply queries may be run' })
|
1188
|
+
parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
|
1189
|
+
parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
|
1190
|
+
parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
|
1191
|
+
parser.add_argument('-cl', '--checkForLoop', { nargs: '?', help: 'Check for loops in the priorities, Optional argument is list of operator keys to consider. For example [["banana", 0], ["food", 1]]' })
|
1192
|
+
parser.add_argument('-r', '--reset', { action: 'store_true', help: 'Get the server to bypass the cache and rebuild everything' })
|
1193
|
+
parser.add_argument('-q', '--query', { help: 'Run the specified query' })
|
1194
|
+
parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
|
1195
|
+
parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
|
1196
|
+
parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
|
1197
|
+
parser.add_argument('--parenthesized', { action: 'store_true', help: 'Show the generated phrases with parenthesis.' })
|
1198
|
+
parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
|
1199
|
+
parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
|
1200
|
+
parser.add_argument('-p', '--print', { help: 'Print the specified elements c === config, w === words, b === bridges, o === operators d === objects (d for data), h === hierarchy, g === generators, s === semantics, l === load t=tests ordering p === priorities a == associations j == JSON sent to server. for example --print wb' })
|
1201
|
+
parser.add_argument('-s', '--save', { action: 'store_true', help: 'When running with the --query flag this will save the current run to the test file. When running without the --query flag all tests will be run and resaved.' })
|
1202
|
+
parser.add_argument('-sd', '--saveDeveloper', { action: 'store_true', help: 'Same as -s but the query will not show up in the info command.' })
|
1203
|
+
parser.add_argument('-dl', '--debugLoops', { action: 'store_true', help: 'When running with the --debugLoops flag the logs calls to semantics and generators will be immediately written to the console ' })
|
1204
|
+
parser.add_argument('-d', '--debug', { action: 'store_true', help: 'When running with the --debug flag this set the debug flag in the config' })
|
1205
|
+
parser.add_argument('-da', '--debugAssociation', { action: 'store_true', help: helpDebugAssociation })
|
1206
|
+
parser.add_argument('-dw', '--debugWord', { action: 'store_true', help: helpDebugWord })
|
1207
|
+
parser.add_argument('-dh', '--debugHierarchy', { action: 'store_true', help: helpDebugHierarchy })
|
1208
|
+
parser.add_argument('-dp', '--debugPriority', { action: 'store_true', help: helpDebugPriority })
|
1209
|
+
parser.add_argument('-dcp', '--debugContextualPriority', { action: 'store_true', help: helpDebugContextualPriority })
|
1210
|
+
parser.add_argument('-db', '--debugBridge', { action: 'store_true', help: helpDebugBridge })
|
1211
|
+
parser.add_argument('-do', '--debugOperator', { action: 'store_true', help: helpDebugOperator })
|
1212
|
+
parser.add_argument('-ep', '--explainPriorities', { action: 'store_true', help: 'The server will return all priorities including the generated one along with an explanation of there they came from' })
|
1213
|
+
parser.add_argument('-dic', '--debugIncludeConvolutions', { nargs: '?', help: 'When running with the --debugIncludeConvolutions flag the logs will include convolutions which are somewhat annoyingly verbose. Default is false' })
|
1214
|
+
|
1215
|
+
const args = parser.parse_args()
|
1216
|
+
args.count = args.count || 1
|
1217
|
+
|
1218
|
+
if (args.rebuildTemplateFull) {
|
1219
|
+
args.rebuildTemplate = true
|
1220
|
+
}
|
1217
1221
|
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
+
// dont debug the load of the KM's if rebuild template is on since we want to debug the template rebuild not the load
|
1223
|
+
if (args.rebuildTemplate) {
|
1224
|
+
global.pauseDebugging = true
|
1225
|
+
}
|
1222
1226
|
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1227
|
+
config = await createConfig()
|
1228
|
+
setupConfig(config)
|
1229
|
+
processResults = processResults({ config, errorHandler })
|
1226
1230
|
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1231
|
+
if (args.rebuildTemplate) {
|
1232
|
+
global.pauseDebugging = false
|
1233
|
+
}
|
1230
1234
|
|
1231
|
-
|
1235
|
+
// setup();
|
1232
1236
|
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1237
|
+
if (args.parenthesized) {
|
1238
|
+
config.parenthesized = true
|
1239
|
+
}
|
1240
|
+
if (args.checkForLoop) {
|
1241
|
+
try {
|
1242
|
+
args.checkForLoop = JSON.parse(args.checkForLoop)
|
1243
|
+
const isKey = (what) => {
|
1244
|
+
if (!Array.isArray(what)) {
|
1245
|
+
return false
|
1246
|
+
}
|
1247
|
+
if (what.length !== 2) {
|
1248
|
+
return false
|
1249
|
+
}
|
1250
|
+
if (!typeof what[0] == 'string') {
|
1251
|
+
return false
|
1252
|
+
}
|
1253
|
+
if (!typeof what[1] == 'number') {
|
1254
|
+
return false
|
1255
|
+
}
|
1256
|
+
return true
|
1248
1257
|
}
|
1249
|
-
if (!
|
1250
|
-
|
1258
|
+
if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
|
1259
|
+
throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
|
1251
1260
|
}
|
1252
|
-
|
1253
|
-
}
|
1254
|
-
if (!Array.isArray(args.checkForLoop) || args.checkForLoop.some((value) => !isKey(value))) {
|
1261
|
+
} catch (e) {
|
1255
1262
|
throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
|
1256
1263
|
}
|
1257
|
-
}
|
1258
|
-
|
1264
|
+
} else {
|
1265
|
+
if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
|
1266
|
+
args.checkForLoop = true
|
1267
|
+
}
|
1259
1268
|
}
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1269
|
+
if (args.debugAssociation) {
|
1270
|
+
console.log(helpDebugAssociation)
|
1271
|
+
runtime.process.exit(-1)
|
1272
|
+
}
|
1273
|
+
if (args.debugWord) {
|
1274
|
+
console.log(helpDebugWord)
|
1275
|
+
runtime.process.exit(-1)
|
1276
|
+
}
|
1277
|
+
if (args.debugHierarchy) {
|
1278
|
+
console.log(helpDebugHierarchy)
|
1279
|
+
runtime.process.exit(-1)
|
1280
|
+
}
|
1281
|
+
if (args.debugPriority) {
|
1282
|
+
console.log(helpDebugPriority)
|
1283
|
+
runtime.process.exit(-1)
|
1284
|
+
}
|
1285
|
+
if (args.debugBridge) {
|
1286
|
+
console.log(helpDebugBridge)
|
1287
|
+
runtime.process.exit(-1)
|
1288
|
+
}
|
1289
|
+
if (args.debugOperator) {
|
1290
|
+
console.log(helpDebugOperator)
|
1291
|
+
runtime.process.exit(-1)
|
1263
1292
|
}
|
1264
|
-
}
|
1265
|
-
if (args.debugAssociation) {
|
1266
|
-
console.log(helpDebugAssociation)
|
1267
|
-
runtime.process.exit(-1)
|
1268
|
-
}
|
1269
|
-
if (args.debugWord) {
|
1270
|
-
console.log(helpDebugWord)
|
1271
|
-
runtime.process.exit(-1)
|
1272
|
-
}
|
1273
|
-
if (args.debugHierarchy) {
|
1274
|
-
console.log(helpDebugHierarchy)
|
1275
|
-
runtime.process.exit(-1)
|
1276
|
-
}
|
1277
|
-
if (args.debugPriority) {
|
1278
|
-
console.log(helpDebugPriority)
|
1279
|
-
runtime.process.exit(-1)
|
1280
|
-
}
|
1281
|
-
if (args.debugBridge) {
|
1282
|
-
console.log(helpDebugBridge)
|
1283
|
-
runtime.process.exit(-1)
|
1284
|
-
}
|
1285
|
-
if (args.debugOperator) {
|
1286
|
-
console.log(helpDebugOperator)
|
1287
|
-
runtime.process.exit(-1)
|
1288
|
-
}
|
1289
1293
|
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1294
|
+
if (args.clean) {
|
1295
|
+
const tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
|
1296
|
+
for (const test of tests) {
|
1297
|
+
delete test.associations
|
1298
|
+
}
|
1299
|
+
writeTestFile(testConfig.name, tests)
|
1300
|
+
console.log(`Cleaned ${testConfig.name}`)
|
1301
|
+
return
|
1294
1302
|
}
|
1295
|
-
writeTestFile(testConfig.name, tests)
|
1296
|
-
console.log(`Cleaned ${testConfig.name}`)
|
1297
|
-
return
|
1298
|
-
}
|
1299
1303
|
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1304
|
+
if (args.deleteTest) {
|
1305
|
+
let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
|
1306
|
+
tests = tests.filter((test) => test.query !== args.deleteTest)
|
1307
|
+
writeTestFile(testConfig.name, tests)
|
1308
|
+
console.log(`Remove the test for "${args.deleteTest}"`)
|
1309
|
+
return
|
1310
|
+
}
|
1307
1311
|
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1312
|
+
const options = { rebuild: false }
|
1313
|
+
if (args.rebuildTemplate) {
|
1314
|
+
options.rebuild = true
|
1315
|
+
}
|
1316
|
+
if (args.greg) {
|
1317
|
+
config.server('http://localhost:3000', '6804954f-e56d-471f-bbb8-08e3c54d9321')
|
1318
|
+
}
|
1319
|
+
if (args.server) {
|
1320
|
+
config.server(args.server)
|
1321
|
+
}
|
1318
1322
|
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1323
|
+
if (args.queryParams) {
|
1324
|
+
config.setQueryParams(args.queryParams)
|
1325
|
+
}
|
1322
1326
|
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1327
|
+
if (args.debug) {
|
1328
|
+
config.config.debug = true
|
1329
|
+
}
|
1326
1330
|
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1331
|
+
if (args.reset) {
|
1332
|
+
config.config.skip_cache = true
|
1333
|
+
}
|
1330
1334
|
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1335
|
+
if (args.explainPriorities) {
|
1336
|
+
config.config.explain_priorities = true
|
1337
|
+
}
|
1334
1338
|
|
1335
|
-
|
1339
|
+
config.config.debugIncludeConvolutions = args.debugIncludeConvolutions || process.argv.includes('--debugIncludeConvolutions') || process.argv.includes('-dic')
|
1336
1340
|
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
}
|
1342
|
-
configPrinted = true
|
1343
|
-
if (args.print) {
|
1344
|
-
if (args.print.includes('t')) {
|
1345
|
-
console.log('Test queries')
|
1346
|
-
let counter = 0
|
1347
|
-
for (const test of config.tests) {
|
1348
|
-
console.log(`${counter} - ${test.query}`)
|
1349
|
-
counter += 1
|
1350
|
-
}
|
1351
|
-
}
|
1352
|
-
if (args.print.includes('c')) {
|
1353
|
-
const { data } = setupProcessB({ config })
|
1354
|
-
console.log('Config as sent to server')
|
1355
|
-
console.log(JSON.stringify(data, null, 2))
|
1341
|
+
let configPrinted = false
|
1342
|
+
const printConfig = () => {
|
1343
|
+
if (configPrinted) {
|
1344
|
+
return
|
1356
1345
|
}
|
1346
|
+
configPrinted = true
|
1347
|
+
if (args.print) {
|
1348
|
+
if (args.print.includes('t')) {
|
1349
|
+
console.log('Test queries')
|
1350
|
+
let counter = 0
|
1351
|
+
for (const test of config.tests) {
|
1352
|
+
console.log(`${counter} - ${test.query}`)
|
1353
|
+
counter += 1
|
1354
|
+
}
|
1355
|
+
}
|
1356
|
+
if (args.print.includes('c')) {
|
1357
|
+
const { data } = setupProcessB({ config })
|
1358
|
+
console.log('Config as sent to server')
|
1359
|
+
console.log(JSON.stringify(data, null, 2))
|
1360
|
+
}
|
1357
1361
|
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
+
if (args.print.includes('l')) {
|
1363
|
+
console.log('Module load ordering')
|
1364
|
+
for (const km of config.configs) {
|
1365
|
+
console.log(` ${km.name}`)
|
1366
|
+
}
|
1362
1367
|
}
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1368
|
+
if (args.print.includes('w')) {
|
1369
|
+
// { literals: Object, patterns: Array(2), hierarchy: Array(97) }
|
1370
|
+
console.log('literals')
|
1371
|
+
for (const word in config.config.words.literals) {
|
1372
|
+
console.log(' ' + word.concat(...config.config.words.literals[word].map((def, i) => ((i > 0) ? ' '.repeat(4+word.length) : ' ') + JSON.stringify(def) + '\n')))
|
1373
|
+
}
|
1374
|
+
console.log('patterns')
|
1375
|
+
for (const pattern of config.config.words.patterns) {
|
1376
|
+
console.log(' ' + JSON.stringify(pattern))
|
1377
|
+
}
|
1369
1378
|
}
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1379
|
+
if (args.print.includes('b')) {
|
1380
|
+
for (const bridge of config.config.bridges) {
|
1381
|
+
console.log(JSON.stringify(bridge))
|
1382
|
+
}
|
1373
1383
|
}
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1384
|
+
if (args.print.includes('o')) {
|
1385
|
+
for (const operator of config.config.operators) {
|
1386
|
+
console.log(JSON.stringify(operator))
|
1387
|
+
}
|
1378
1388
|
}
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
console.log(JSON.stringify(operator))
|
1389
|
+
if (args.print.includes('j')) {
|
1390
|
+
const { data } = setupProcessB({ config })
|
1391
|
+
console.log(JSON.stringify(data, null, 2))
|
1383
1392
|
}
|
1384
|
-
|
1385
|
-
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
for (const property of properties) {
|
1393
|
-
console.log(` ${property} ===============`)
|
1394
|
-
for (const association of config.config.associations[property]) {
|
1395
|
-
console.log(` ${JSON.stringify(association)}`)
|
1393
|
+
if (args.print.includes('a')) {
|
1394
|
+
console.log('associations ================')
|
1395
|
+
const properties = ['negative', 'positive']
|
1396
|
+
for (const property of properties) {
|
1397
|
+
console.log(` ${property} ===============`)
|
1398
|
+
for (const association of config.config.associations[property]) {
|
1399
|
+
console.log(` ${JSON.stringify(association)}`)
|
1400
|
+
}
|
1396
1401
|
}
|
1397
1402
|
}
|
1398
|
-
|
1399
|
-
|
1400
|
-
console.log(JSON.stringify(config.config.objects, null, 2))
|
1401
|
-
}
|
1402
|
-
if (args.print.includes('p')) {
|
1403
|
-
for (const priority of config.config.priorities) {
|
1404
|
-
console.log(JSON.stringify(priority))
|
1403
|
+
if (args.print.includes('d')) {
|
1404
|
+
console.log(JSON.stringify(config.config.objects, null, 2))
|
1405
1405
|
}
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1409
|
-
|
1406
|
+
if (args.print.includes('p')) {
|
1407
|
+
for (const priority of config.config.priorities) {
|
1408
|
+
console.log(JSON.stringify(priority))
|
1409
|
+
}
|
1410
1410
|
}
|
1411
|
-
|
1412
|
-
|
1413
|
-
|
1414
|
-
for (const semantic of easyToRead) {
|
1415
|
-
semantic.match = semantic.match.toString()
|
1416
|
-
semantic.apply = semantic.apply.toString()
|
1417
|
-
if (semantic.applyWrapped) {
|
1418
|
-
semantic.applyWrapped = semantic.applyWrapped.toString()
|
1411
|
+
if (args.print.includes('h')) {
|
1412
|
+
for (const edge of config.config.hierarchy) {
|
1413
|
+
console.log(JSON.stringify(edge))
|
1419
1414
|
}
|
1420
1415
|
}
|
1421
|
-
|
1422
|
-
|
1423
|
-
|
1424
|
-
|
1425
|
-
|
1426
|
-
|
1427
|
-
|
1416
|
+
if (args.print.includes('g')) {
|
1417
|
+
const easyToRead = _.cloneDeep(config.config.generators)
|
1418
|
+
for (const semantic of easyToRead) {
|
1419
|
+
semantic.match = semantic.match.toString()
|
1420
|
+
semantic.apply = semantic.apply.toString()
|
1421
|
+
if (semantic.applyWrapped) {
|
1422
|
+
semantic.applyWrapped = semantic.applyWrapped.toString()
|
1423
|
+
}
|
1424
|
+
}
|
1425
|
+
console.dir(easyToRead)
|
1426
|
+
}
|
1427
|
+
if (args.print.includes('s')) {
|
1428
|
+
const easyToRead = _.cloneDeep(config.config.semantics)
|
1429
|
+
for (const semantic of easyToRead) {
|
1430
|
+
semantic.match = semantic.match.toString()
|
1431
|
+
semantic.apply = semantic.apply.toString()
|
1432
|
+
}
|
1433
|
+
console.dir(easyToRead)
|
1428
1434
|
}
|
1429
|
-
console.dir(easyToRead)
|
1430
1435
|
}
|
1431
1436
|
}
|
1432
|
-
}
|
1433
1437
|
|
1434
|
-
|
1438
|
+
checkTemplate(template)
|
1435
1439
|
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1440
|
+
if (template) {
|
1441
|
+
let needsRebuild
|
1442
|
+
if (args.rebuildTemplate && !args.rebuildTemplateFull) {
|
1443
|
+
// get the startOfChanges for the partial rebuild
|
1444
|
+
needsRebuild = config.needsRebuild(template.template, template.instance, { ...options, rebuild: false })
|
1445
|
+
} else {
|
1446
|
+
// do a check or full rebuild
|
1447
|
+
needsRebuild = config.needsRebuild(template.template, template.instance, options)
|
1448
|
+
}
|
1445
1449
|
|
1446
|
-
|
1447
|
-
|
1448
|
-
|
1450
|
+
if (needsRebuild.needsRebuild) {
|
1451
|
+
if (needsRebuild.previousResultss) {
|
1452
|
+
console.log('Rebuild using the optimization to use previous results until a change is hit. For a full rebuild use -rtf')
|
1453
|
+
}
|
1454
|
+
console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
|
1455
|
+
options.rebuild = true
|
1456
|
+
config.config.rebuild = true
|
1457
|
+
}
|
1458
|
+
try {
|
1459
|
+
await config.load(rebuildTemplate, template.template, template.instance, { rebuild: needsRebuild.needsRebuild || options.rebuild, previousResultss: needsRebuild.previousResultss, startOfChanges: needsRebuild.startOfChanges })
|
1460
|
+
} catch (e) {
|
1461
|
+
console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
|
1462
|
+
runtime.process.exit(-1)
|
1463
|
+
}
|
1464
|
+
if (!args.query) {
|
1465
|
+
printConfig()
|
1466
|
+
}
|
1467
|
+
if (needsRebuild.needsRebuild) {
|
1468
|
+
return
|
1449
1469
|
}
|
1450
|
-
console.log(`This module "${config.name}" needs rebuilding all other arguments will be ignored. Try again after the template is rebuilt.`)
|
1451
|
-
options.rebuild = true
|
1452
|
-
config.config.rebuild = true
|
1453
1470
|
}
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
console.error(`Error loading template for ${config.name}. ${e.error ? e.error : e}${e.stack ? e.stack : ''}`)
|
1458
|
-
runtime.process.exit(-1)
|
1471
|
+
|
1472
|
+
if (args.retrain) {
|
1473
|
+
config.config.retrain = true
|
1459
1474
|
}
|
1460
|
-
|
1461
|
-
|
1475
|
+
|
1476
|
+
if (args.saveDeveloper) {
|
1477
|
+
args.save = true
|
1462
1478
|
}
|
1463
|
-
if (
|
1464
|
-
|
1479
|
+
if (args.test || args.testVerbose || args.testAllVerbose || args.save) {
|
1480
|
+
global.transitoryMode = true
|
1465
1481
|
}
|
1466
|
-
|
1467
|
-
|
1468
|
-
|
1469
|
-
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
|
1478
|
-
|
1479
|
-
|
1480
|
-
|
1481
|
-
// } else if (args.build) {
|
1482
|
-
} else if (args.info) {
|
1483
|
-
showInfo(description, section, config)
|
1484
|
-
} else if (args.test || args.testVerbose || args.testAllVerbose) {
|
1485
|
-
// TODO make test always a string
|
1486
|
-
if (typeof test === 'string') {
|
1487
|
-
const l = (n, hasError) => {
|
1488
|
-
if (n === 0) {
|
1489
|
-
if (hasError) {
|
1490
|
-
runtime.process.exit(-1)
|
1482
|
+
if (!args.query && !args.test && !args.info && (args.save || args.saveDeveloper)) {
|
1483
|
+
global.transitoryMode = true
|
1484
|
+
saveTests(config, test, testConfig, args.saveDeveloper)
|
1485
|
+
// } else if (args.build) {
|
1486
|
+
} else if (args.info) {
|
1487
|
+
showInfo(description, section, config)
|
1488
|
+
} else if (args.test || args.testVerbose || args.testAllVerbose) {
|
1489
|
+
// TODO make test always a string
|
1490
|
+
if (typeof test === 'string') {
|
1491
|
+
const l = async (n, hasError) => {
|
1492
|
+
if (n === 0) {
|
1493
|
+
if (hasError) {
|
1494
|
+
runtime.process.exit(-1)
|
1495
|
+
}
|
1496
|
+
return
|
1491
1497
|
}
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
test
|
1499
|
-
|
1500
|
-
|
1501
|
-
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
for (const result of results) {
|
1507
|
-
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1508
|
-
result.hasError = true
|
1509
|
-
}
|
1510
|
-
if (!args.testNoParenthesized) {
|
1511
|
-
if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
|
1498
|
+
let useTestConfig = testConfig
|
1499
|
+
if (args.testModuleName) {
|
1500
|
+
useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
|
1501
|
+
useTestConfig.testModuleName = args.testModuleName
|
1502
|
+
test = useTestConfig.name
|
1503
|
+
}
|
1504
|
+
await runTests(config, test, { args, debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
|
1505
|
+
let newError = false
|
1506
|
+
if (results.length > 0) {
|
1507
|
+
let headerShown = false
|
1508
|
+
|
1509
|
+
let hasError = false
|
1510
|
+
for (const result of results) {
|
1511
|
+
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1512
1512
|
result.hasError = true
|
1513
1513
|
}
|
1514
|
-
if (
|
1514
|
+
if (!args.testNoParenthesized) {
|
1515
|
+
if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
|
1516
|
+
result.hasError = true
|
1517
|
+
}
|
1518
|
+
if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
|
1519
|
+
result.hasError = true
|
1520
|
+
}
|
1521
|
+
}
|
1522
|
+
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1515
1523
|
result.hasError = true
|
1516
1524
|
}
|
1525
|
+
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1526
|
+
result.hasError = true
|
1527
|
+
}
|
1528
|
+
if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
|
1529
|
+
result.hasError = true
|
1530
|
+
}
|
1531
|
+
if (result.hasError) {
|
1532
|
+
hasError = true
|
1533
|
+
}
|
1517
1534
|
}
|
1518
|
-
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1519
|
-
result.hasError = true
|
1520
|
-
}
|
1521
|
-
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1522
|
-
result.hasError = true
|
1523
|
-
}
|
1524
|
-
if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
|
1525
|
-
result.hasError = true
|
1526
|
-
}
|
1527
|
-
if (result.hasError) {
|
1528
|
-
hasError = true
|
1529
|
-
}
|
1530
|
-
}
|
1531
1535
|
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1536
|
+
if (hasError) {
|
1537
|
+
console.log('**************************** ERRORS ************************')
|
1538
|
+
for (const result of results) {
|
1539
|
+
console.log('Utterance: ', result.utterance)
|
1540
|
+
const show = (label, expected, actual) => {
|
1541
|
+
if (JSON.stringify(expected) !== JSON.stringify(actual)) {
|
1542
|
+
if (!headerShown) {
|
1543
|
+
console.log(' Failure')
|
1544
|
+
}
|
1545
|
+
console.log(` expected ${label}`, expected)
|
1546
|
+
console.log(` actual ${label} `, actual)
|
1547
|
+
newError = true
|
1548
|
+
headerShown = true
|
1549
|
+
if (args.vimdiff) {
|
1550
|
+
vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
|
1551
|
+
}
|
1552
|
+
result.hasError = true
|
1553
|
+
}
|
1554
|
+
}
|
1555
|
+
show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
|
1556
|
+
if (!args.testNoParenthesized) {
|
1557
|
+
show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
|
1558
|
+
}
|
1559
|
+
show('responses', result.expected.responses, result.actual.responses)
|
1560
|
+
if (!args.testNoParenthesized) {
|
1561
|
+
show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
|
1562
|
+
}
|
1563
|
+
/*
|
1564
|
+
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1538
1565
|
if (!headerShown) {
|
1539
1566
|
console.log(' Failure')
|
1540
1567
|
}
|
1541
|
-
console.log(
|
1542
|
-
console.log(
|
1568
|
+
console.log(' expected paraphrases', result.expected.paraphrases)
|
1569
|
+
console.log(' actual paraphrases ', result.actual.paraphrases)
|
1543
1570
|
newError = true
|
1544
1571
|
headerShown = true
|
1545
|
-
if (args.vimdiff) {
|
1546
|
-
vimdiff(actual, expected, `"${result.utterance}" - ${label}`)
|
1547
|
-
}
|
1548
|
-
result.hasError = true
|
1549
|
-
}
|
1550
|
-
}
|
1551
|
-
show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
|
1552
|
-
if (!args.testNoParenthesized) {
|
1553
|
-
show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
|
1554
|
-
}
|
1555
|
-
show('responses', result.expected.responses, result.actual.responses)
|
1556
|
-
if (!args.testNoParenthesized) {
|
1557
|
-
show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
|
1558
|
-
}
|
1559
|
-
/*
|
1560
|
-
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1561
|
-
if (!headerShown) {
|
1562
|
-
console.log(' Failure')
|
1563
1572
|
}
|
1564
|
-
|
1565
|
-
|
1566
|
-
|
1567
|
-
|
1568
|
-
|
1569
|
-
|
1570
|
-
|
1571
|
-
|
1573
|
+
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1574
|
+
if (!headerShown) {
|
1575
|
+
console.log(' Failure')
|
1576
|
+
}
|
1577
|
+
console.log(' expected responses ', result.expected.responses)
|
1578
|
+
console.log(' actual responses ', result.actual.responses)
|
1579
|
+
newError = true
|
1580
|
+
headerShown = true
|
1572
1581
|
}
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
|
1581
|
-
|
1582
|
+
*/
|
1583
|
+
if (JSON.stringify(result.expected.checked) !== JSON.stringify(result.actual.checked)) {
|
1584
|
+
if (!headerShown) {
|
1585
|
+
console.log(' Failure')
|
1586
|
+
}
|
1587
|
+
const widths = [4, 18, 72]
|
1588
|
+
const lines = new Lines(widths)
|
1589
|
+
lines.setElement(1, 1, 'expected checked objects')
|
1590
|
+
lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
|
1591
|
+
lines.log()
|
1592
|
+
lines.setElement(1, 1, 'actual checked objects')
|
1593
|
+
lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
|
1594
|
+
lines.log()
|
1595
|
+
if (args.vimdiff) {
|
1596
|
+
show('checked properties for objects', result.expected.checked, result.actual.checked)
|
1597
|
+
}
|
1598
|
+
newError = true
|
1599
|
+
headerShown = true
|
1582
1600
|
}
|
1583
|
-
|
1584
|
-
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1588
|
-
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1601
|
+
if (!sameJSON(result.expected.checkedContexts, result.actual.checkedContexts)) {
|
1602
|
+
if (!headerShown) {
|
1603
|
+
console.log(' Failure')
|
1604
|
+
}
|
1605
|
+
const widths = [4, 18, 72]
|
1606
|
+
const lines = new Lines(widths)
|
1607
|
+
lines.setElement(1, 1, 'expected checked contexts', true)
|
1608
|
+
lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
|
1609
|
+
lines.log()
|
1610
|
+
lines.setElement(1, 1, 'actual checked contexts', true)
|
1611
|
+
lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
|
1612
|
+
lines.log()
|
1613
|
+
if (args.vimdiff) {
|
1614
|
+
show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
|
1615
|
+
}
|
1616
|
+
newError = true
|
1617
|
+
headerShown = true
|
1593
1618
|
}
|
1594
|
-
newError = true
|
1595
|
-
headerShown = true
|
1596
1619
|
}
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1620
|
+
} else {
|
1621
|
+
if (results.length > 0 && args.vimdiff) {
|
1622
|
+
for (const result of results) {
|
1623
|
+
vimdiff(result.actual, result.expected)
|
1600
1624
|
}
|
1601
|
-
const widths = [4, 18, 72]
|
1602
|
-
const lines = new Lines(widths)
|
1603
|
-
lines.setElement(1, 1, 'expected checked contexts', true)
|
1604
|
-
lines.setElement(2, 2, JSON.stringify(result.expected.checkedContexts, null, 2))
|
1605
|
-
lines.log()
|
1606
|
-
lines.setElement(1, 1, 'actual checked contexts', true)
|
1607
|
-
lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
|
1608
|
-
lines.log()
|
1609
|
-
if (args.vimdiff) {
|
1610
|
-
show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
|
1611
|
-
}
|
1612
|
-
newError = true
|
1613
|
-
headerShown = true
|
1614
1625
|
}
|
1615
1626
|
}
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1627
|
+
if (hasError) {
|
1628
|
+
if (!headerShown) {
|
1629
|
+
if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
|
1630
|
+
console.log('There are failures due to things other than paraphrases, responses and checked properties being different. They are not shown because you ran -tv or -tva which only shows difference in paraphrase and results. Usually what I do is -s and do a diff to make sure there are no other problems. If the paraphrases or results were different they would have shown here.')
|
1631
|
+
}
|
1620
1632
|
}
|
1621
|
-
}
|
1622
|
-
}
|
1623
|
-
if (hasError) {
|
1624
|
-
if (!headerShown) {
|
1625
1633
|
if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
|
1626
|
-
console.log('
|
1627
|
-
|
1628
|
-
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
for (const result of results) {
|
1634
|
-
if (result.hasError) {
|
1635
|
-
errorCount += 1
|
1634
|
+
console.log('use -v arg to write files expected.json and actual.json in the current directory for detailed comparison. Or do -s and then git diff the changes.')
|
1635
|
+
// console.log(JSON.stringify(contexts))
|
1636
|
+
let errorCount = 0
|
1637
|
+
for (const result of results) {
|
1638
|
+
if (result.hasError) {
|
1639
|
+
errorCount += 1
|
1640
|
+
}
|
1636
1641
|
}
|
1642
|
+
console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
|
1637
1643
|
}
|
1638
|
-
console.log(`**************************** THERE WERE ${errorCount} TEST FAILURES ************************`)
|
1639
1644
|
}
|
1640
1645
|
}
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1646
|
+
// const contexts = { failures: results }
|
1647
|
+
l(n - 1, hasError || newError)
|
1648
|
+
}).catch((error) => {
|
1649
|
+
console.error(error)
|
1650
|
+
runtime.process.exit(-1)
|
1651
|
+
errorHandler(error)
|
1652
|
+
})
|
1653
|
+
}
|
1654
|
+
await l(args.count, false)
|
1655
|
+
} else {
|
1656
|
+
test()
|
1657
|
+
}
|
1658
|
+
} else if (args.loop) {
|
1659
|
+
const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
|
1660
|
+
const f = () => readline.question('Enter query? (newline to quit) ', query => {
|
1661
|
+
query = query.trim()
|
1662
|
+
if (query.length === 0) {
|
1663
|
+
return readline.close()
|
1664
|
+
}
|
1665
|
+
const promise = _process(config, query, { testsFN: test }).then((results) => {
|
1666
|
+
console.log(results.responses.join(' '))
|
1648
1667
|
})
|
1668
|
+
if (!('then' in promise)) {
|
1669
|
+
throw new Error('Return a promise from process in the definition of knowledgeModule')
|
1670
|
+
}
|
1671
|
+
promise
|
1672
|
+
.then(() => {
|
1673
|
+
f()
|
1674
|
+
})
|
1675
|
+
.catch((e) => {
|
1676
|
+
if (e.errno == 'ECONNREFUSED') {
|
1677
|
+
console.log(e)
|
1678
|
+
readline.close()
|
1679
|
+
} else {
|
1680
|
+
console.log(e)
|
1681
|
+
f()
|
1682
|
+
}
|
1683
|
+
})
|
1684
|
+
})
|
1685
|
+
f()
|
1686
|
+
} else if (args.query) {
|
1687
|
+
let useTestConfig = testConfig
|
1688
|
+
if (args.testModuleName) {
|
1689
|
+
config.testConfig.testModuleName = args.testModuleName
|
1690
|
+
config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
|
1691
|
+
// useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
|
1692
|
+
// useTestConfig.testModuleName = args.testModuleName
|
1649
1693
|
}
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
} else if (args.loop) {
|
1655
|
-
const readline = runtime.readline.createInterface({ input: runtime.process.stdin, output: runtime.process.stdout })
|
1656
|
-
const f = () => readline.question('Enter query? (newline to quit) ', query => {
|
1657
|
-
query = query.trim()
|
1658
|
-
if (query.length === 0) {
|
1659
|
-
return readline.close()
|
1694
|
+
const objects = getObjects(config.config.objects)(config.uuid)
|
1695
|
+
// for the compare
|
1696
|
+
if (args.objectDiff) {
|
1697
|
+
global.beforeObjects = _.cloneDeep(objects)
|
1660
1698
|
}
|
1661
|
-
|
1662
|
-
|
1663
|
-
})
|
1664
|
-
|
1665
|
-
throw new Error('Return a promise from process in the definition of knowledgeModule')
|
1699
|
+
try {
|
1700
|
+
await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1701
|
+
} catch (error) {
|
1702
|
+
console.log('Error', error)
|
1666
1703
|
}
|
1667
|
-
promise
|
1668
|
-
.then(() => {
|
1669
|
-
f()
|
1670
|
-
})
|
1671
|
-
.catch((e) => {
|
1672
|
-
if (e.errno == 'ECONNREFUSED') {
|
1673
|
-
console.log(e)
|
1674
|
-
readline.close()
|
1675
|
-
} else {
|
1676
|
-
console.log(e)
|
1677
|
-
f()
|
1678
|
-
}
|
1679
|
-
})
|
1680
|
-
})
|
1681
|
-
f()
|
1682
|
-
} else if (args.query) {
|
1683
|
-
let useTestConfig = testConfig
|
1684
|
-
if (args.testModuleName) {
|
1685
|
-
config.testConfig.testModuleName = args.testModuleName
|
1686
|
-
config.testConfig.checks = config.getConfigs()[args.testModuleName].getTestConfig().checks
|
1687
|
-
// useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
|
1688
|
-
// useTestConfig.testModuleName = args.testModuleName
|
1689
1704
|
}
|
1690
|
-
|
1691
|
-
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
try {
|
1696
|
-
await processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1697
|
-
} catch (error) {
|
1698
|
-
console.log('Error', error)
|
1705
|
+
printConfig()
|
1706
|
+
} finally {
|
1707
|
+
debugger
|
1708
|
+
if (config) {
|
1709
|
+
config.terminate()
|
1699
1710
|
}
|
1700
1711
|
}
|
1701
|
-
printConfig()
|
1702
1712
|
} else {
|
1703
1713
|
const initConfig = async (config) => {
|
1704
1714
|
if (template) {
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -1807,6 +1807,24 @@ class Config {
|
|
1807
1807
|
config.words.hierarchy = hierarchyPrime
|
1808
1808
|
}
|
1809
1809
|
|
1810
|
+
terminate() {
|
1811
|
+
this.configs.forEach((km) => {
|
1812
|
+
const config = km.config
|
1813
|
+
debugger
|
1814
|
+
if (!config.terminatorFn) {
|
1815
|
+
this.terminatorFn(this)
|
1816
|
+
} else {
|
1817
|
+
config.terminatorFn(this)
|
1818
|
+
}
|
1819
|
+
})
|
1820
|
+
}
|
1821
|
+
|
1822
|
+
setTerminator(terminatorFn) {
|
1823
|
+
if (terminatorFn) {
|
1824
|
+
this.terminatorFn = terminatorFn
|
1825
|
+
}
|
1826
|
+
}
|
1827
|
+
|
1810
1828
|
// configs = [ { config, namespace } ... ]
|
1811
1829
|
constructor (config, module, clientProcess) {
|
1812
1830
|
if (config instanceof Config) {
|
@@ -1873,6 +1891,7 @@ class Config {
|
|
1873
1891
|
currentConfig.wasInitialized = true
|
1874
1892
|
}
|
1875
1893
|
}
|
1894
|
+
this.terminatorFn = () => {}
|
1876
1895
|
if (config) {
|
1877
1896
|
this.name = config.name
|
1878
1897
|
}
|
@@ -2080,6 +2099,7 @@ class Config {
|
|
2080
2099
|
cp._uuid = cp.configs[0]._uuid
|
2081
2100
|
// update uuid here set the uuid in the objects and add error checking
|
2082
2101
|
cp.initializerFn = this.initializerFn
|
2102
|
+
cp.terminatorFn = this.terminatorFn
|
2083
2103
|
// cp._api = _.cloneDeep(this._api)
|
2084
2104
|
if (this._apiConstructor) {
|
2085
2105
|
cp._api = this._apiConstructor(cp)
|