theprogrammablemind_4wp 8.0.0-beta.2 → 8.0.0-beta.20
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +8 -4
- package/package.json +12 -13
- package/src/config.js +52 -73
package/client.js
CHANGED
@@ -865,6 +865,10 @@ const getConfigForTest = (config, testConfig) => {
|
|
865
865
|
|
866
866
|
const runTest = async (config, expected, { args, verbose, testConfig, debug }) => {
|
867
867
|
const test = expected.query
|
868
|
+
if (args.query && args.query != test) {
|
869
|
+
// no run this
|
870
|
+
return
|
871
|
+
}
|
868
872
|
// initialize in between test so state is not preserved since the test was adding without state
|
869
873
|
config.rebuild()
|
870
874
|
const errorHandler = (error) => {
|
@@ -1582,7 +1586,7 @@ const knowledgeModuleImpl = async ({
|
|
1582
1586
|
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1583
1587
|
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' })
|
1584
1588
|
// parser.add_argument('-ttr', '--testToRun', { help: 'Only the specified test will be run' })
|
1585
|
-
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' })
|
1589
|
+
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.' })
|
1586
1590
|
parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
|
1587
1591
|
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' })
|
1588
1592
|
// 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.' })
|
@@ -1663,7 +1667,7 @@ const knowledgeModuleImpl = async ({
|
|
1663
1667
|
throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
|
1664
1668
|
}
|
1665
1669
|
} catch (e) {
|
1666
|
-
throw new Error(
|
1670
|
+
throw new Error('Error for the checkForLoop argument. Expected a JSON array of operator keys of the form "[<id>, <level>]"')
|
1667
1671
|
}
|
1668
1672
|
} else {
|
1669
1673
|
if (process.argv.includes('--checkForLoop') || process.argv.includes('-cl')) {
|
@@ -1994,7 +1998,7 @@ const knowledgeModuleImpl = async ({
|
|
1994
1998
|
lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
|
1995
1999
|
lines.log()
|
1996
2000
|
if (args.vimdiff) {
|
1997
|
-
|
2001
|
+
show('checked properties for objects', result.expected.checked, result.actual.checked)
|
1998
2002
|
}
|
1999
2003
|
newError = true
|
2000
2004
|
headerShown = true
|
@@ -2012,7 +2016,7 @@ const knowledgeModuleImpl = async ({
|
|
2012
2016
|
lines.setElement(2, 2, JSON.stringify(result.actual.checkedContexts, null, 2))
|
2013
2017
|
lines.log()
|
2014
2018
|
if (args.vimdiff) {
|
2015
|
-
|
2019
|
+
show('checked properties for context', result.expected.checkedContexts, result.actual.checkedContexts)
|
2016
2020
|
}
|
2017
2021
|
newError = true
|
2018
2022
|
headerShown = true
|
package/package.json
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"devDependencies": {
|
3
|
-
"eslint-plugin-import": "^2.23.4",
|
4
|
-
"jest": "^29.7.0",
|
5
|
-
"@typescript-eslint/parser": "^4.28.4",
|
6
3
|
"@typescript-eslint/eslint-plugin": "^4.28.4",
|
7
|
-
"eslint
|
4
|
+
"@typescript-eslint/parser": "^4.28.4",
|
5
|
+
"eslint": "^7.31.0",
|
8
6
|
"eslint-config-standard": "^16.0.3",
|
7
|
+
"eslint-plugin-import": "^2.23.4",
|
8
|
+
"eslint-plugin-node": "^11.1.0",
|
9
9
|
"eslint-plugin-promise": "^5.1.0",
|
10
|
-
"
|
10
|
+
"jest": "^29.7.0"
|
11
11
|
},
|
12
12
|
"scripts": {
|
13
13
|
"to:debug": "node inspect node_modules/.bin/jest --runInBand -t NEO23",
|
@@ -52,19 +52,18 @@
|
|
52
52
|
],
|
53
53
|
"author": "dev@thinktelligence.com",
|
54
54
|
"dependencies": {
|
55
|
+
"base-64": "^1.0.0",
|
55
56
|
"deep-equal": "^2.0.4",
|
56
|
-
"
|
57
|
+
"fs": "0.0.1-security",
|
57
58
|
"json-diff": "^1.0.3",
|
59
|
+
"json-stable-stringify": "^1.0.1",
|
58
60
|
"lodash": "^4.17.20",
|
59
|
-
"
|
60
|
-
"base-64": "^1.0.0",
|
61
|
-
"sort-json": "^2.0.0",
|
61
|
+
"node-fetch": "^2.6.1",
|
62
62
|
"readline": "^1.3.0",
|
63
63
|
"scriptjs": "^2.5.9",
|
64
|
-
"
|
65
|
-
"
|
66
|
-
"node-fetch": "^2.6.1"
|
64
|
+
"sort-json": "^2.0.0",
|
65
|
+
"uuid": "^8.3.2"
|
67
66
|
},
|
68
|
-
"version": "8.0.0-beta.
|
67
|
+
"version": "8.0.0-beta.20",
|
69
68
|
"license": "UNLICENSED"
|
70
69
|
}
|
package/src/config.js
CHANGED
@@ -262,7 +262,12 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
262
262
|
}
|
263
263
|
if (bridge.children) {
|
264
264
|
for (const child of bridge.children) {
|
265
|
-
config.addHierarchy(child, bridge.id)
|
265
|
+
// config.addHierarchy(child, bridge.id)
|
266
|
+
if (child.child) {
|
267
|
+
config.addHierarchy(child.child, bridge.id, child.instance)
|
268
|
+
} else {
|
269
|
+
config.addHierarchy(child, bridge.id)
|
270
|
+
}
|
266
271
|
}
|
267
272
|
}
|
268
273
|
if (bridge.operator) {
|
@@ -270,12 +275,20 @@ const handleBridgeProps = (config, bridge, { addFirst, uuid } = {}) => {
|
|
270
275
|
}
|
271
276
|
if (bridge.parents) {
|
272
277
|
for (const parent of bridge.parents) {
|
273
|
-
|
278
|
+
if (parent.parent) {
|
279
|
+
config.addHierarchy(bridge.id, parent.parent, parent.instance)
|
280
|
+
} else {
|
281
|
+
config.addHierarchy(bridge.id, parent)
|
282
|
+
}
|
274
283
|
}
|
275
284
|
}
|
276
285
|
if (bridge.isA) {
|
277
286
|
for (const parent of bridge.isA) {
|
278
|
-
|
287
|
+
if (parent.parent) {
|
288
|
+
config.addHierarchy(bridge.id, parent.parent, parent.instance)
|
289
|
+
} else {
|
290
|
+
config.addHierarchy(bridge.id, parent)
|
291
|
+
}
|
279
292
|
}
|
280
293
|
}
|
281
294
|
if (bridge.before) {
|
@@ -1197,7 +1210,9 @@ class Config {
|
|
1197
1210
|
// console.log("instanceFragments", instanceFragments)
|
1198
1211
|
}
|
1199
1212
|
}
|
1200
|
-
if (startOfChanges
|
1213
|
+
if (startOfChanges) {
|
1214
|
+
return { needsRebuild: true, startOfChanges, previousResultss: instance.resultss }
|
1215
|
+
} else if (startOfChanges || instance.resultss) {
|
1201
1216
|
return { needsRebuild: !(instance && sameQueries && sameFragments), startOfChanges, previousResultss: instance.resultss }
|
1202
1217
|
} else {
|
1203
1218
|
return { needsRebuild: !(instance && sameQueries && sameFragments) }
|
@@ -1309,9 +1324,9 @@ class Config {
|
|
1309
1324
|
}
|
1310
1325
|
}
|
1311
1326
|
|
1312
|
-
addHierarchy (child, parent) {
|
1327
|
+
addHierarchy (child, parent, instance) {
|
1313
1328
|
if (child && parent || !child || Array.isArray(child) || (typeof child === 'string' && !parent)) {
|
1314
|
-
this.addHierarchyChildParent(child, parent)
|
1329
|
+
this.addHierarchyChildParent(child, parent, instance)
|
1315
1330
|
// this.addHierarchyProperties ({ child, parent })
|
1316
1331
|
} else {
|
1317
1332
|
this.addHierarchyProperties(child)
|
@@ -1319,26 +1334,32 @@ class Config {
|
|
1319
1334
|
}
|
1320
1335
|
|
1321
1336
|
addHierarchyProperties (edge) {
|
1322
|
-
const { child, parent } = edge
|
1337
|
+
const { child, parent, instance } = edge
|
1323
1338
|
if (typeof child !== 'string') {
|
1324
1339
|
throw new Error(`addHierarchy expected child property to be a string. got ${JSON.stringify(child)}`)
|
1325
1340
|
}
|
1326
1341
|
if (typeof parent !== 'string') {
|
1327
1342
|
throw new Error(`addHierarchy expected parent property to be a string. got ${JSON.stringify(parent)}`)
|
1328
1343
|
}
|
1344
|
+
if (instance && typeof instance !== 'boolean') {
|
1345
|
+
throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
|
1346
|
+
}
|
1329
1347
|
debugHierarchy([child, parent])
|
1330
1348
|
this.config.hierarchy.push(edge)
|
1331
1349
|
// TODO greg11 this.hierarchy.addEdge(edge)
|
1332
|
-
this._delta.json.hierarchy.push([child, parent])
|
1350
|
+
this._delta.json.hierarchy.push([child, parent, instance || false])
|
1333
1351
|
}
|
1334
1352
|
|
1335
|
-
addHierarchyChildParent (child, parent) {
|
1353
|
+
addHierarchyChildParent (child, parent, instance) {
|
1336
1354
|
if (typeof child !== 'string') {
|
1337
1355
|
throw new Error(`addHierarchy expected child to be a string. got ${JSON.stringify(child)}`)
|
1338
1356
|
}
|
1339
1357
|
if (typeof parent !== 'string') {
|
1340
1358
|
throw new Error(`addHierarchy expected parent to be a string. got ${JSON.stringify(parent)}`)
|
1341
1359
|
}
|
1360
|
+
if (instance && typeof instance !== 'boolean') {
|
1361
|
+
throw new Error(`addHierarchy expected instance property to be a boolean or undefined. got ${JSON.stringify(instance)}`)
|
1362
|
+
}
|
1342
1363
|
debugHierarchy([child, parent])
|
1343
1364
|
if (this.config.hierarchy.find((element) => {
|
1344
1365
|
const hc = hierarchyCanonical(element)
|
@@ -1349,9 +1370,9 @@ class Config {
|
|
1349
1370
|
return
|
1350
1371
|
}
|
1351
1372
|
|
1352
|
-
this.config.hierarchy.push([child, parent])
|
1373
|
+
this.config.hierarchy.push([child, parent, instance || false])
|
1353
1374
|
// this.hierarchy.addEdge([child, parent])
|
1354
|
-
this._delta.json.hierarchy.push([child, parent])
|
1375
|
+
this._delta.json.hierarchy.push([child, parent, instance || false])
|
1355
1376
|
}
|
1356
1377
|
|
1357
1378
|
getBridge (id, level) {
|
@@ -1620,6 +1641,10 @@ class Config {
|
|
1620
1641
|
return client.process(this, query, options)
|
1621
1642
|
}
|
1622
1643
|
|
1644
|
+
query (query, options) {
|
1645
|
+
return this.process(query, options)
|
1646
|
+
}
|
1647
|
+
|
1623
1648
|
processQuery (query, options) {
|
1624
1649
|
return this.process(query, options)
|
1625
1650
|
}
|
@@ -1797,24 +1822,6 @@ class Config {
|
|
1797
1822
|
// when running configs any bridges added are marked as transitory so that the associated will ignore those op's
|
1798
1823
|
this.transitoryMode = false
|
1799
1824
|
|
1800
|
-
// check for duplicate bridges
|
1801
|
-
if (config && config.bridges) {
|
1802
|
-
let duplicated = new Set()
|
1803
|
-
const seen = new Set()
|
1804
|
-
for (const bridge of config.bridges) {
|
1805
|
-
const id = `${bridge.id}/${bridge.level}`
|
1806
|
-
if (seen.has(id)) {
|
1807
|
-
duplicated.add(id)
|
1808
|
-
} else {
|
1809
|
-
seen.add(id)
|
1810
|
-
}
|
1811
|
-
}
|
1812
|
-
duplicated = Array.from(duplicated)
|
1813
|
-
if (duplicated.length > 0) {
|
1814
|
-
throw new Error(`In the KM ${config.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
1815
|
-
}
|
1816
|
-
}
|
1817
|
-
|
1818
1825
|
if (config && config.words) {
|
1819
1826
|
initWords(config.words)
|
1820
1827
|
isValidWordDef(config.words)
|
@@ -1863,6 +1870,7 @@ class Config {
|
|
1863
1870
|
}
|
1864
1871
|
this.get('objects').namespaced[this._uuid] = {}
|
1865
1872
|
this.valid()
|
1873
|
+
this.checks()
|
1866
1874
|
debugConfigProps(this.config)
|
1867
1875
|
}
|
1868
1876
|
|
@@ -2608,7 +2616,7 @@ class Config {
|
|
2608
2616
|
|
2609
2617
|
this.hierarchy.edges = this.config.hierarchy
|
2610
2618
|
this.valid()
|
2611
|
-
this.
|
2619
|
+
this.checks()
|
2612
2620
|
}
|
2613
2621
|
|
2614
2622
|
nameToUUID (name) {
|
@@ -2822,6 +2830,11 @@ class Config {
|
|
2822
2830
|
}
|
2823
2831
|
}
|
2824
2832
|
|
2833
|
+
checks () {
|
2834
|
+
this.checkOperators()
|
2835
|
+
this.checkBridges()
|
2836
|
+
}
|
2837
|
+
|
2825
2838
|
checkOperators () {
|
2826
2839
|
if (!this.config.operators) {
|
2827
2840
|
return
|
@@ -2842,53 +2855,19 @@ class Config {
|
|
2842
2855
|
return
|
2843
2856
|
}
|
2844
2857
|
|
2845
|
-
|
2846
|
-
|
2847
|
-
"634a678b-8d92-4464-bf65-943a82f404d8": {
|
2848
|
-
"ids": [ "tankConcept" ],
|
2849
|
-
"namespace": [ "ns1" ]
|
2850
|
-
},
|
2851
|
-
console.log('before check', JSON.stringify(this._eqClasses, null, 2))
|
2852
|
-
*/
|
2853
|
-
|
2854
|
-
const errors = []
|
2855
|
-
/*
|
2856
|
-
const namespaces = this.config.namespaces
|
2857
|
-
const nsToIds = {}
|
2858
|
-
for (const uuid in namespaces) {
|
2859
|
-
const namespace = namespaces[uuid].namespace
|
2860
|
-
const ns = namespace.join('#')
|
2861
|
-
if (!nsToIds[ns]) {
|
2862
|
-
nsToIds[ns] = new Set()
|
2863
|
-
}
|
2864
|
-
const ids = nsToIds[ns]
|
2865
|
-
for (const id of namespaces[uuid].ids) {
|
2866
|
-
if (ids.has(id)) {
|
2867
|
-
if (ns === '') {
|
2868
|
-
const dups = this.config.bridges.filter( (bridge) => bridge.id == id )
|
2869
|
-
errors.push(`Id '${id}' is defined more than once in the bridges of the base namespace of the KM ${this.name}, Dups are ${JSON.stringify(dups)}`)
|
2870
|
-
} else {
|
2871
|
-
errors.push(`Id '${id}' is defined more than once in the bridges of the ${ns} namespace of the KM ${this.name}`)
|
2872
|
-
}
|
2873
|
-
} else {
|
2874
|
-
ids.add(id)
|
2875
|
-
}
|
2876
|
-
}
|
2877
|
-
}
|
2878
|
-
*/
|
2879
|
-
|
2880
|
-
const keyIsPresent = {}
|
2858
|
+
let duplicated = new Set()
|
2859
|
+
const seen = new Set()
|
2881
2860
|
for (const bridge of this.config.bridges) {
|
2882
|
-
const
|
2883
|
-
if (
|
2884
|
-
|
2861
|
+
const id = `${bridge.id}/${bridge.level} (namespace: ${bridge.uuid || this.uuid})`
|
2862
|
+
if (seen.has(id)) {
|
2863
|
+
duplicated.add(id)
|
2885
2864
|
} else {
|
2886
|
-
|
2865
|
+
seen.add(id)
|
2887
2866
|
}
|
2888
2867
|
}
|
2889
|
-
|
2890
|
-
if (
|
2891
|
-
throw
|
2868
|
+
duplicated = Array.from(duplicated)
|
2869
|
+
if (duplicated.length > 0) {
|
2870
|
+
throw new Error(`In the KM ${this.name}, the following operators are duplicated in the bridges: ${duplicated}`)
|
2892
2871
|
}
|
2893
2872
|
};
|
2894
2873
|
|