theprogrammablemind 7.5.0-beta.9 → 7.5.1
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 +54 -18
- package/lines.js +3 -0
- package/package.json +1 -1
- package/src/config.js +281 -15
- package/src/digraph.js +4 -0
- package/src/generators.js +4 -2
- package/src/helpers.js +1 -1
- package/src/semantics.js +4 -2
package/client.js
CHANGED
@@ -78,7 +78,15 @@ const listable = (hierarchy) => (c, type) => {
|
|
78
78
|
return false
|
79
79
|
}
|
80
80
|
|
81
|
-
const isA = (hierarchy) => (child, parent) =>
|
81
|
+
const isA = (hierarchy) => (child, parent) => {
|
82
|
+
if (child.marker) {
|
83
|
+
child = child.marker
|
84
|
+
}
|
85
|
+
if (parent.marker) {
|
86
|
+
parent = parent.marker
|
87
|
+
}
|
88
|
+
return hierarchy.isA(child, parent)
|
89
|
+
}
|
82
90
|
|
83
91
|
const asList = (context) => {
|
84
92
|
if (context.marker === 'list') {
|
@@ -518,7 +526,7 @@ const processInstance = (config, instance) => {
|
|
518
526
|
global.transitoryMode = transitoryMode
|
519
527
|
}
|
520
528
|
|
521
|
-
const _process = async (config, query, { credentials, writeTests, isTest, saveDeveloper, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
|
529
|
+
const _process = async (config, query, { commandLineArgs, credentials, writeTests, isTest, saveDeveloper, testConfig, testsFN, errorHandler = defaultErrorHandler } = {}) => {
|
522
530
|
if (credentials) {
|
523
531
|
config.server(credentials.server, credentials.key)
|
524
532
|
}
|
@@ -539,6 +547,9 @@ const _process = async (config, query, { credentials, writeTests, isTest, saveDe
|
|
539
547
|
}
|
540
548
|
|
541
549
|
let { data, /* generators, semantics, */ hierarchy } = setupProcessB({ config, allowDelta: true })
|
550
|
+
if (commandLineArgs && commandLineArgs.checkForLoop) {
|
551
|
+
data.checkForLoop = true
|
552
|
+
}
|
542
553
|
let queries = query.split('\\n')
|
543
554
|
|
544
555
|
try {
|
@@ -670,9 +681,12 @@ const runTest = async (config, expected, { verbose, afterTest, testConfig, debug
|
|
670
681
|
defaultErrorHandler(error)
|
671
682
|
}
|
672
683
|
|
673
|
-
|
684
|
+
let objects = getObjects(config.config.objects)(config.uuid)
|
685
|
+
if (testConfig.testModuleName) {
|
686
|
+
objects = getObjects(config.config.objects)(config.getConfigs()[testConfig.testModuleName].uuid)
|
687
|
+
}
|
674
688
|
config.beforeQuery({ query: test, isModule: false, objects })
|
675
|
-
config.resetMotivations()
|
689
|
+
// config.resetMotivations()
|
676
690
|
try {
|
677
691
|
const result = await _process(config, test, { errorHandler, isTest: true })
|
678
692
|
result.query = test
|
@@ -783,7 +797,7 @@ const runTests = async (config, testFile, juicyBits) => {
|
|
783
797
|
const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
|
784
798
|
config.rebuild()
|
785
799
|
const objects = getObjects(config.config.objects)(config.uuid)
|
786
|
-
config.resetMotivations()
|
800
|
+
//config.resetMotivations()
|
787
801
|
config.beforeQuery({ query: test, isModule: false, objects })
|
788
802
|
console.log(test)
|
789
803
|
const result = await _process(config, test, { isTest: true })
|
@@ -858,6 +872,7 @@ const submitBugToAPI = async (subscription_id, subscription_password, config) =>
|
|
858
872
|
})
|
859
873
|
}
|
860
874
|
|
875
|
+
/*
|
861
876
|
const submitBug = async (subscription_id, subscription_password, config, utterance, retries = 2) => {
|
862
877
|
// TODO remove these from the config
|
863
878
|
const properties = ['expected_contexts', 'expected_generated']
|
@@ -894,6 +909,7 @@ const submitBug = async (subscription_id, subscription_password, config, utteran
|
|
894
909
|
throw error
|
895
910
|
})
|
896
911
|
}
|
912
|
+
*/
|
897
913
|
|
898
914
|
const defaultErrorHandler = async (error) => {
|
899
915
|
if (error.logs) {
|
@@ -1048,7 +1064,6 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
|
|
1048
1064
|
if (typeof queryOrExtraConfig === 'string') {
|
1049
1065
|
query = { query }
|
1050
1066
|
}
|
1051
|
-
console.log('query', query.query)
|
1052
1067
|
config.config.skipSemantics = skipSemantics
|
1053
1068
|
const transitoryMode = global.transitoryMode
|
1054
1069
|
if (property == 'fragments') {
|
@@ -1072,6 +1087,11 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
|
|
1072
1087
|
// TODO pass in the error handler like the other ones
|
1073
1088
|
defaultInnerProcess(config, defaultErrorHandler, results)
|
1074
1089
|
}
|
1090
|
+
if (results.contexts.length > 1) {
|
1091
|
+
console.log(`query ${query.query}. There is ${results.contexts.length} contexts in the results. Make sure its producing the results that you expect.`)
|
1092
|
+
} else {
|
1093
|
+
console.log(`query ${query.query}`)
|
1094
|
+
}
|
1075
1095
|
global.transitoryMode = transitoryMode
|
1076
1096
|
config.config.skipSemantics = null
|
1077
1097
|
results.query = query.query
|
@@ -1252,7 +1272,7 @@ const knowledgeModule = async ({
|
|
1252
1272
|
description: 'Entodicton knowledge module'
|
1253
1273
|
})
|
1254
1274
|
|
1255
|
-
parser.add_argument('-
|
1275
|
+
parser.add_argument('-tmn', '--testModuleName', { help: 'When running tests instead of using the current modules tests use the specified modules tests' })
|
1256
1276
|
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1257
1277
|
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' })
|
1258
1278
|
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' })
|
@@ -1263,11 +1283,12 @@ const knowledgeModule = async ({
|
|
1263
1283
|
parser.add_argument('-i', '--info', { action: 'store_true', help: 'Print meta-data for the module' })
|
1264
1284
|
parser.add_argument('-v', '--vimdiff', { action: 'store_true', help: 'For failures run vimdiff' })
|
1265
1285
|
parser.add_argument('-g', '--greg', { action: 'store_true', help: 'Set the server to be localhost so I can debug stuff' })
|
1286
|
+
parser.add_argument('-cl', '--checkForLoop', { action: 'store_true', help: 'Check for loops in the priorities' })
|
1266
1287
|
parser.add_argument('-r', '--retrain', { action: 'store_true', help: 'Get the server to retrain the neural nets' })
|
1267
1288
|
parser.add_argument('-q', '--query', { help: 'Run the specified query' })
|
1268
1289
|
parser.add_argument('-ip ', '--server', { help: 'Server to run against' })
|
1269
1290
|
parser.add_argument('-qp ', '--queryParams', { help: 'Query params for the server call' })
|
1270
|
-
parser.add_argument('-
|
1291
|
+
parser.add_argument('-dt', '--deleteTest', { help: 'Delete the specified query from the tests file.' })
|
1271
1292
|
parser.add_argument('-c', '--clean', { help: 'Remove data from the test files. a === association' })
|
1272
1293
|
parser.add_argument('-od', '--objectDiff', { action: 'store_true', help: 'When showing the objects use a colour diff' })
|
1273
1294
|
parser.add_argument('-daa', '--dontAddAssociations', { action: 'store_true', help: 'Do not add associations from the tests.' })
|
@@ -1306,11 +1327,11 @@ const knowledgeModule = async ({
|
|
1306
1327
|
return
|
1307
1328
|
}
|
1308
1329
|
|
1309
|
-
if (args.
|
1330
|
+
if (args.deleteTest) {
|
1310
1331
|
let tests = JSON.parse(runtime.fs.readFileSync(testConfig.name))
|
1311
|
-
tests = tests.filter( (test) => test.query !== args.
|
1332
|
+
tests = tests.filter( (test) => test.query !== args.deleteTest );
|
1312
1333
|
writeTestFile(testConfig.name, tests)
|
1313
|
-
console.log(`Remove the test for "${args.
|
1334
|
+
console.log(`Remove the test for "${args.deleteTest}"`)
|
1314
1335
|
return
|
1315
1336
|
}
|
1316
1337
|
|
@@ -1466,7 +1487,15 @@ const knowledgeModule = async ({
|
|
1466
1487
|
}
|
1467
1488
|
return
|
1468
1489
|
}
|
1469
|
-
|
1490
|
+
let useTestConfig = testConfig
|
1491
|
+
if (args.testModuleName) {
|
1492
|
+
useTestConfig = config.getConfigs()[args.testModuleName].getTestConfig()
|
1493
|
+
useTestConfig.testModuleName = args.testModuleName
|
1494
|
+
test = useTestConfig.name
|
1495
|
+
|
1496
|
+
}
|
1497
|
+
// runTests(config, args.testFileName ? `${args.testFileName}.test.json` : test, { debug: args.debug, testConfig: testConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
|
1498
|
+
runTests(config, test, { debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
|
1470
1499
|
if (results.length > 0 && args.vimdiff) {
|
1471
1500
|
for (const result of results) {
|
1472
1501
|
vimdiff(result.expected, result.actual)
|
@@ -1515,19 +1544,25 @@ const knowledgeModule = async ({
|
|
1515
1544
|
if (!headerShown) {
|
1516
1545
|
console.log(' Failure')
|
1517
1546
|
}
|
1518
|
-
|
1519
|
-
|
1547
|
+
const widths = [4, 18, 72]
|
1548
|
+
const lines = new Lines(widths)
|
1549
|
+
lines.setElement(1, 1, 'expected checked')
|
1550
|
+
lines.setElement(2, 2, JSON.stringify(result.expected.checked, null, 2))
|
1551
|
+
lines.log()
|
1552
|
+
lines.setElement(1, 1, 'actual checked')
|
1553
|
+
lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
|
1554
|
+
lines.log()
|
1520
1555
|
newError = true
|
1521
1556
|
headerShown = true
|
1522
1557
|
}
|
1523
1558
|
}
|
1524
1559
|
}
|
1525
1560
|
if (!headerShown) {
|
1526
|
-
if (!(
|
1561
|
+
if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
|
1527
1562
|
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.')
|
1528
1563
|
}
|
1529
1564
|
}
|
1530
|
-
if (!(
|
1565
|
+
if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
|
1531
1566
|
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.')
|
1532
1567
|
// console.log(JSON.stringify(contexts))
|
1533
1568
|
console.log('**************************** ERRORS ************************')
|
@@ -1582,13 +1617,14 @@ const knowledgeModule = async ({
|
|
1582
1617
|
}
|
1583
1618
|
config.beforeQuery({ query: args.query, isModule: false, objects })
|
1584
1619
|
try {
|
1585
|
-
processResults(_process(config, args.query, { dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1620
|
+
processResults(_process(config, args.query, { commandLineArgs: args, dontAddAssociations: args.dontAddAssociations, writeTests: args.save || args.saveDeveloper, saveDeveloper: args.saveDeveloper, testConfig, testsFN: test }))
|
1586
1621
|
} catch( error ) {
|
1587
1622
|
console.log('Error', error);
|
1588
1623
|
}
|
1589
1624
|
}
|
1590
1625
|
} else {
|
1591
1626
|
config.addAssociationsFromTests(config.tests);
|
1627
|
+
config.setTestConfig(testConfig)
|
1592
1628
|
//for (let query in config.tests) {
|
1593
1629
|
// config.addAssociations(config.tests[query].associations || []);
|
1594
1630
|
//}
|
@@ -1638,7 +1674,7 @@ module.exports = {
|
|
1638
1674
|
process: _process,
|
1639
1675
|
where,
|
1640
1676
|
w,
|
1641
|
-
submitBug,
|
1677
|
+
// submitBug,
|
1642
1678
|
ensureTestFile,
|
1643
1679
|
build,
|
1644
1680
|
processContext,
|
package/lines.js
CHANGED
@@ -12,6 +12,9 @@ class Lines {
|
|
12
12
|
// will wrap to next line within the column
|
13
13
|
setElement (row, column, value) {
|
14
14
|
const values = value.toString().split('\n')
|
15
|
+
if (column >= this.widths.length) {
|
16
|
+
throw "Column out of range."
|
17
|
+
}
|
15
18
|
const width = this.widths[column]
|
16
19
|
let index = 0
|
17
20
|
for (value of values) {
|
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -330,6 +330,17 @@ class Config {
|
|
330
330
|
return `${maybeName}${counter}`
|
331
331
|
}
|
332
332
|
|
333
|
+
setTestConfig(testConfig) {
|
334
|
+
if (this.name == 'ui') {
|
335
|
+
console.log('ui setting testConfig')
|
336
|
+
}
|
337
|
+
this.testConfig = testConfig
|
338
|
+
}
|
339
|
+
|
340
|
+
getTestConfig() {
|
341
|
+
return this.testConfig
|
342
|
+
}
|
343
|
+
|
333
344
|
defaultConfig () {
|
334
345
|
this.config = {
|
335
346
|
operators: [], // TODO
|
@@ -531,9 +542,23 @@ class Config {
|
|
531
542
|
client.build({ config: this, target: this.name, beforeQuery: () => {}, template, ...options })
|
532
543
|
} else {
|
533
544
|
// no change
|
534
|
-
this.initInstances.push(instance)
|
535
|
-
|
536
|
-
|
545
|
+
// this.initInstances.push({ ...instance, name: config.name })
|
546
|
+
const isEmpty = ( instance ) => {
|
547
|
+
const properties = [
|
548
|
+
"queries",
|
549
|
+
"resultss",
|
550
|
+
"fragments",
|
551
|
+
"semantics",
|
552
|
+
"associations",
|
553
|
+
]
|
554
|
+
return !properties.find( (property) => instance[property].length > 0 )
|
555
|
+
}
|
556
|
+
if (!isEmpty(instance)) {
|
557
|
+
instance.name = this.name
|
558
|
+
this.initInstances.push(instance)
|
559
|
+
this.instances.push(instance)
|
560
|
+
client.processInstance(this, instance)
|
561
|
+
}
|
537
562
|
}
|
538
563
|
}
|
539
564
|
|
@@ -1090,7 +1115,7 @@ class Config {
|
|
1090
1115
|
config = _.cloneDeep(config)
|
1091
1116
|
this.config = config
|
1092
1117
|
for (let bridge of this.config.bridges) {
|
1093
|
-
const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'implicit', 'inverted', 'isA',
|
1118
|
+
const valid = [ 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generators', 'id', 'implicit', 'inverted', 'isA', 'children', 'parents',
|
1094
1119
|
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy' ]
|
1095
1120
|
helpers.validProps(valid, bridge, 'bridge')
|
1096
1121
|
/*
|
@@ -1101,6 +1126,16 @@ class Config {
|
|
1101
1126
|
})
|
1102
1127
|
}
|
1103
1128
|
*/
|
1129
|
+
if (bridge.children) {
|
1130
|
+
for (let child of bridge.children) {
|
1131
|
+
this.addHierarchy(child, bridge.id)
|
1132
|
+
}
|
1133
|
+
}
|
1134
|
+
if (bridge.parents) {
|
1135
|
+
for (let parent of bridge.parents) {
|
1136
|
+
this.addHierarchy(bridge.id, parent)
|
1137
|
+
}
|
1138
|
+
}
|
1104
1139
|
if (bridge.isA) {
|
1105
1140
|
for (let parent of bridge.isA) {
|
1106
1141
|
this.addHierarchy(bridge.id, parent)
|
@@ -1379,12 +1414,13 @@ class Config {
|
|
1379
1414
|
cp.name = this.name
|
1380
1415
|
cp.description = this.description
|
1381
1416
|
cp.tests = this.tests
|
1382
|
-
cp.motivations = this.motivations
|
1417
|
+
cp.motivations = [...this.motivations]
|
1383
1418
|
cp.isModule = this.isModule
|
1384
1419
|
cp.loadedForTesting = this.loadedForTesting
|
1385
1420
|
cp.initInstances = this.initInstances.slice()
|
1386
1421
|
cp.instances = this.instances.slice()
|
1387
1422
|
cp.configCounter = this.configCounter
|
1423
|
+
cp.testConfig = this.testConfig
|
1388
1424
|
|
1389
1425
|
cp.initConfig = _.cloneDeep(this.initConfig)
|
1390
1426
|
cp.defaultConfig()
|
@@ -1511,7 +1547,8 @@ class Config {
|
|
1511
1547
|
}
|
1512
1548
|
|
1513
1549
|
initializeFromConfigs () {
|
1514
|
-
this.configs.forEach(({ config, namespace, uuid }) => {
|
1550
|
+
// [...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
|
1551
|
+
[...this.configs].reverse().forEach(({ config, namespace, uuid }) => {
|
1515
1552
|
/*
|
1516
1553
|
let objects = this.get('objects')
|
1517
1554
|
if (namespace) {
|
@@ -1747,6 +1784,7 @@ class Config {
|
|
1747
1784
|
}
|
1748
1785
|
this.config.objects.namespaced = {}
|
1749
1786
|
this.resetWasInitialized()
|
1787
|
+
this.resetMotivations()
|
1750
1788
|
|
1751
1789
|
// reorder configs base on load ordering
|
1752
1790
|
{
|
@@ -1762,8 +1800,17 @@ class Config {
|
|
1762
1800
|
this.configs = [...oconfigs]
|
1763
1801
|
}
|
1764
1802
|
|
1803
|
+
const addInternals = []
|
1765
1804
|
const inits = []
|
1766
1805
|
const initAfterApis = []
|
1806
|
+
if (false && this.config.hierarchy.find( (pair) => JSON.stringify(pair) === JSON.stringify(["equipable2","property"]))) {
|
1807
|
+
debugger // happened
|
1808
|
+
}
|
1809
|
+
if (false && this.name == 'countable') {
|
1810
|
+
debugger // in rebuild
|
1811
|
+
}
|
1812
|
+
const reverseIt = true
|
1813
|
+
const interleaved = true
|
1767
1814
|
this.configs.forEach((km) => {
|
1768
1815
|
const namespace = km.namespace
|
1769
1816
|
this.config.objects.namespaced[km._uuid] = {}
|
@@ -1796,7 +1843,12 @@ class Config {
|
|
1796
1843
|
const args = { isModule, addWord: aw, km: kmFn, hierarchy: this.hierarchy, config, baseConfig: this, currentConfig: config, uuid: config._uuid, objects: namespacedObjects, namespace, api: config.api }
|
1797
1844
|
config.initializerFn(args)
|
1798
1845
|
if (config.initAfterApi) {
|
1799
|
-
|
1846
|
+
// reverse the list
|
1847
|
+
initAfterApis.unshift({ config, args })
|
1848
|
+
} else {
|
1849
|
+
if (interleaved) {
|
1850
|
+
initAfterApis.unshift(null)
|
1851
|
+
}
|
1800
1852
|
}
|
1801
1853
|
// greg
|
1802
1854
|
if (config._api) {
|
@@ -1804,27 +1856,112 @@ class Config {
|
|
1804
1856
|
// reverse the list
|
1805
1857
|
inits.unshift( () => config._api.initialize({ config: this, km: kmFn, api: config._api }) )
|
1806
1858
|
// config._api.initialize({ config, api: config._api })
|
1859
|
+
} else {
|
1860
|
+
if (interleaved) {
|
1861
|
+
inits.unshift(null)
|
1862
|
+
}
|
1807
1863
|
}
|
1808
1864
|
config._api.objects = namespacedObjects
|
1809
1865
|
config._api.config = () => this
|
1810
1866
|
config._api.uuid = config._uuid
|
1867
|
+
} else {
|
1868
|
+
if (interleaved) {
|
1869
|
+
inits.unshift(null)
|
1870
|
+
}
|
1811
1871
|
}
|
1812
1872
|
config.setUUIDs()
|
1813
1873
|
config.applyNamespace(config.config, namespace, config.uuid)
|
1814
1874
|
if (!isSelf) {
|
1815
|
-
|
1875
|
+
if (!reverseIt) {
|
1876
|
+
addInternals.push(config)
|
1877
|
+
} else {
|
1878
|
+
addInternals.unshift(config)
|
1879
|
+
}
|
1880
|
+
// this.addInternal(config, true, false, false, true)
|
1881
|
+
} else {
|
1882
|
+
if (interleaved) {
|
1883
|
+
addInternals.unshift(null)
|
1884
|
+
}
|
1816
1885
|
}
|
1817
1886
|
km.valid()
|
1818
1887
|
})
|
1819
|
-
|
1820
|
-
|
1821
|
-
|
1888
|
+
|
1889
|
+
if (addInternals.length !== inits.length || addInternals.length !== initAfterApis.length) {
|
1890
|
+
debugger // bug
|
1822
1891
|
}
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1892
|
+
|
1893
|
+
const generators = this.config.generators
|
1894
|
+
const semantics = this.config.semantics
|
1895
|
+
if (reverseIt) {
|
1896
|
+
this.config.generators = []
|
1897
|
+
this.config.semantics = []
|
1826
1898
|
}
|
1827
|
-
|
1899
|
+
|
1900
|
+
if (!interleaved) {
|
1901
|
+
for (const config of addInternals) {
|
1902
|
+
if (!reverseIt) {
|
1903
|
+
this.addInternal(config, true, false, false, true)
|
1904
|
+
} else {
|
1905
|
+
this.addInternalR(config, true, false, false, true)
|
1906
|
+
}
|
1907
|
+
}
|
1908
|
+
// console.log('inits from config', inits)
|
1909
|
+
for (const init of inits) {
|
1910
|
+
init()
|
1911
|
+
}
|
1912
|
+
for (let init of initAfterApis) {
|
1913
|
+
// init.args.isAfterApi = true
|
1914
|
+
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
|
1915
|
+
}
|
1916
|
+
this.instances.forEach((instance) => client.processInstance(this, instance))
|
1917
|
+
} else {
|
1918
|
+
const base = {
|
1919
|
+
operators: this.config.operators,
|
1920
|
+
bridges: this.config.bridges,
|
1921
|
+
hierarchy: this.config.hierarchy,
|
1922
|
+
priorities: this.config.priorities,
|
1923
|
+
associations: this.config.associations,
|
1924
|
+
words: this.config.words
|
1925
|
+
}
|
1926
|
+
|
1927
|
+
this.config.operators = []
|
1928
|
+
this.config.bridges = []
|
1929
|
+
this.config.hierarchy = []
|
1930
|
+
this.config.priorities = []
|
1931
|
+
this.config.associations = { positive: [], negative: [] }
|
1932
|
+
this.config.words = {}
|
1933
|
+
|
1934
|
+
for (let i = 0; i < addInternals.length; ++i) {
|
1935
|
+
let name;
|
1936
|
+
if (addInternals[i]) {
|
1937
|
+
this.addInternalR(addInternals[i], true, false, false, true)
|
1938
|
+
name = addInternals[i].name
|
1939
|
+
} else{
|
1940
|
+
this.addInternalR(base, true, false, false, true)
|
1941
|
+
name = this.name
|
1942
|
+
}
|
1943
|
+
// console.log('name -------------', name)
|
1944
|
+
if (inits[i]) {
|
1945
|
+
inits[i]()
|
1946
|
+
}
|
1947
|
+
if (initAfterApis[i]) {
|
1948
|
+
const init = initAfterApis[i]
|
1949
|
+
init.config.initializerFn({ ...init.args, kms: this.getConfigs(), isAfterApi: true })
|
1950
|
+
}
|
1951
|
+
const instance = this.instances.find((instance) => instance.name == name)
|
1952
|
+
if (instance) {
|
1953
|
+
client.processInstance(this, instance)
|
1954
|
+
}
|
1955
|
+
this.hierarchy.edges = this.config.hierarchy
|
1956
|
+
}
|
1957
|
+
// this.instances.forEach((instance) => client.processInstance(this, instance))
|
1958
|
+
}
|
1959
|
+
|
1960
|
+
if (reverseIt) {
|
1961
|
+
this.config.generators = generators.concat(this.config.generators)
|
1962
|
+
this.config.semantics = semantics.concat(this.config.semantics)
|
1963
|
+
}
|
1964
|
+
this.hierarchy.edges = this.config.hierarchy
|
1828
1965
|
this.valid()
|
1829
1966
|
this.checkBridges()
|
1830
1967
|
}
|
@@ -2191,6 +2328,13 @@ class Config {
|
|
2191
2328
|
this.configs.forEach((km) => {
|
2192
2329
|
this.instances = (km._config.instances || this.initInstances.slice()).concat(this.instances)
|
2193
2330
|
})
|
2331
|
+
let noDups = []
|
2332
|
+
for (let instance of this.instances) {
|
2333
|
+
if (!noDups.find( (existing) => existing.name == instance.name )) {
|
2334
|
+
noDups.push(instance)
|
2335
|
+
}
|
2336
|
+
}
|
2337
|
+
this.instances = noDups
|
2194
2338
|
|
2195
2339
|
this.rebuild()
|
2196
2340
|
this.valid()
|
@@ -2308,6 +2452,128 @@ class Config {
|
|
2308
2452
|
}
|
2309
2453
|
return this
|
2310
2454
|
}
|
2455
|
+
|
2456
|
+
// assumes this is called in reverse order
|
2457
|
+
addInternalR (more, useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false) {
|
2458
|
+
if (more instanceof Config) {
|
2459
|
+
more.initialize({ force: false })
|
2460
|
+
if (useOldVersion) {
|
2461
|
+
more = more.config
|
2462
|
+
} else {
|
2463
|
+
// more = more.initConfig
|
2464
|
+
more = _.cloneDeep(more.initConfig)
|
2465
|
+
}
|
2466
|
+
}
|
2467
|
+
for (const key of Object.keys(more)) {
|
2468
|
+
const value = more[key]
|
2469
|
+
// TODO remove name and description on the config bag
|
2470
|
+
const noOverwrite = ['name', 'namespaced']
|
2471
|
+
if (!this.config[key]) {
|
2472
|
+
if (allowNameToBeNull) {
|
2473
|
+
if (noOverwrite.includes(key)) {
|
2474
|
+
continue
|
2475
|
+
}
|
2476
|
+
} else if (this.config[key] && noOverwrite.includes(key)) {
|
2477
|
+
continue
|
2478
|
+
}
|
2479
|
+
this.config[key] = value
|
2480
|
+
continue
|
2481
|
+
}
|
2482
|
+
if (key === 'words') {
|
2483
|
+
const configWords = this.config.words
|
2484
|
+
const moreWords = more.words
|
2485
|
+
for (const word of Object.keys(moreWords)) {
|
2486
|
+
if (!configWords[word]) {
|
2487
|
+
configWords[word] = []
|
2488
|
+
}
|
2489
|
+
// configWords[word] = configWords[word].concat(moreWords[word])
|
2490
|
+
configWords[word] = moreWords[word].concat(configWords[word])
|
2491
|
+
}
|
2492
|
+
} else if (key === 'name') {
|
2493
|
+
/*
|
2494
|
+
if (this.config[key] === '') {
|
2495
|
+
this.config[key] = more[key]
|
2496
|
+
}
|
2497
|
+
*/
|
2498
|
+
} else if (key === 'namespaces') {
|
2499
|
+
if (includeNamespaces) {
|
2500
|
+
Object.assign(this.config[key], more[key])
|
2501
|
+
}
|
2502
|
+
} else if (key === 'debug') {
|
2503
|
+
this.config[key] = this.config[key] || more[key]
|
2504
|
+
} else if (key === 'description') {
|
2505
|
+
// this.config[key] += ' ' + more[key].trim()
|
2506
|
+
this.config[key] = more[key].trim() + ' ' + this.config[key]
|
2507
|
+
} else if (key === 'objects') {
|
2508
|
+
if (!skipObjects) {
|
2509
|
+
// namespaced is special
|
2510
|
+
const namespaced = this.config.objects.namespaced
|
2511
|
+
Object.assign(this.config[key], more[key])
|
2512
|
+
this.config.objects.namespaced = namespaced
|
2513
|
+
}
|
2514
|
+
} else if (key === 'associations') {
|
2515
|
+
const configAssociations = this.config.associations
|
2516
|
+
const moreAssociations = more.associations
|
2517
|
+
if (moreAssociations.positive) {
|
2518
|
+
// configAssociations.positive = configAssociations.positive.concat(moreAssociations.positive)
|
2519
|
+
configAssociations.positive = moreAssociations.positive.concat(configAssociations.positive)
|
2520
|
+
}
|
2521
|
+
if (moreAssociations.negative) {
|
2522
|
+
// configAssociations.negative = configAssociations.negative.concat(moreAssociations.negative)
|
2523
|
+
configAssociations.negative = moreAssociations.negative.concat(configAssociations.negative)
|
2524
|
+
}
|
2525
|
+
} else if (Array.isArray(value)) {
|
2526
|
+
// handle allowDups
|
2527
|
+
if (key == 'operators') {
|
2528
|
+
// TODO what about other props
|
2529
|
+
const isDup = (op1, op2) => op1.pattern == op2.pattern
|
2530
|
+
for (const newOne of more[key]) {
|
2531
|
+
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2532
|
+
const oldOne = this.config[key][iOldOne];
|
2533
|
+
if (isDup(newOne, oldOne)) {
|
2534
|
+
if (oldOne.allowDups) {
|
2535
|
+
// the old one takes precedence to match what would happen during the original load
|
2536
|
+
debugger
|
2537
|
+
this.config[key].splice(iOldOne, 1)
|
2538
|
+
break;
|
2539
|
+
}
|
2540
|
+
}
|
2541
|
+
}
|
2542
|
+
}
|
2543
|
+
}
|
2544
|
+
if (key == 'bridges') {
|
2545
|
+
// TODO what about other props
|
2546
|
+
const idDup = (b1, b2) => b1.id == b2.id && b1.level == b2.level && b1.bridge == b2.bridge
|
2547
|
+
for (const newOne of more[key]) {
|
2548
|
+
for (let iOldOne = 0; iOldOne < this.config[key].length; ++iOldOne) {
|
2549
|
+
const oldOne = this.config[key][iOldOne];
|
2550
|
+
if (newOne.id == oldOne.id) {
|
2551
|
+
if (oldOne.allowDups) {
|
2552
|
+
// the old one takes precedence to match what would happen during the original load
|
2553
|
+
this.config[key].splice(iOldOne, 1)
|
2554
|
+
break;
|
2555
|
+
}
|
2556
|
+
}
|
2557
|
+
}
|
2558
|
+
}
|
2559
|
+
}
|
2560
|
+
// console.log('key', key, 'XXX')
|
2561
|
+
// console.log('more', JSON.stringify(more, null, 2))
|
2562
|
+
// this.config[key] = this.config[key].concat(more[key])
|
2563
|
+
if (key == '2enerators') {
|
2564
|
+
debugger
|
2565
|
+
}
|
2566
|
+
// this.config[key] = this.config[key].concat(more[key])
|
2567
|
+
this.config[key] = more[key].concat(this.config[key])
|
2568
|
+
} else {
|
2569
|
+
if (!(key in this.config)) {
|
2570
|
+
throw `Unexpected property in config ${key}`
|
2571
|
+
}
|
2572
|
+
this.config[key] = more[key]
|
2573
|
+
}
|
2574
|
+
}
|
2575
|
+
return this
|
2576
|
+
}
|
2311
2577
|
}
|
2312
2578
|
|
2313
2579
|
module.exports = {
|
package/src/digraph.js
CHANGED
package/src/generators.js
CHANGED
@@ -195,10 +195,12 @@ class Generators {
|
|
195
195
|
} catch( e ) {
|
196
196
|
// the next if handle this
|
197
197
|
generated = null
|
198
|
+
e.retryCall = () => generator.apply(args, objects, g, args.gs, context, hierarchy, config, response, log)
|
199
|
+
const help = 'The error has a retryCall property that will recall the function that failed.'
|
198
200
|
if (e.stack && e.message) {
|
199
|
-
errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.toString()} stack is ${e.stack}. Generator is ${generator.toString()}`
|
201
|
+
errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.toString()} stack is ${e.stack}. Generator is ${generator.toString()}. ${help}`
|
200
202
|
} else if (e.error) {
|
201
|
-
errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.error.join()}. Generator is ${generator.toString()}`
|
203
|
+
errorMessage = `Error applying generator '${generator.notes}'. Error is ${e.error.join()}. Generator is ${generator.toString()}. ${help}`
|
202
204
|
} else {
|
203
205
|
errorMessage = e.toString()
|
204
206
|
}
|
package/src/helpers.js
CHANGED
@@ -227,7 +227,7 @@ const validProps = (valids, object, type) => {
|
|
227
227
|
}
|
228
228
|
}
|
229
229
|
if (!okay) {
|
230
|
-
throw `Unknown property "${prop}" in the ${type}. Valid properties are ${
|
230
|
+
throw `Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`
|
231
231
|
}
|
232
232
|
}
|
233
233
|
}
|
package/src/semantics.js
CHANGED
@@ -189,10 +189,12 @@ class Semantics {
|
|
189
189
|
} catch( e ) {
|
190
190
|
contextPrime = null
|
191
191
|
let errorMessage
|
192
|
+
e.retryCall = () => semantic.apply(args, context, s, log, options)
|
193
|
+
const help = 'The error has a retryCall property that will recall the function that failed.'
|
192
194
|
if (e.stack && e.message) {
|
193
|
-
errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.toString()} stack is ${e.stack}. Semantic is ${semantic.toString()}`
|
195
|
+
errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.toString()} stack is ${e.stack}. Semantic is ${semantic.toString()}. ${help}`
|
194
196
|
} else if (e.error) {
|
195
|
-
errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.error.join()}. Semantic is ${semantic.toString()}`
|
197
|
+
errorMessage = `Error applying semantics '${semantic.notes}'. Error is ${e.error.join()}. Semantic is ${semantic.toString()}. ${help}`
|
196
198
|
} else {
|
197
199
|
errorMessage = e.toString();
|
198
200
|
}
|