theprogrammablemind 7.5.8-beta.25 → 7.5.8-beta.27
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 +48 -30
- package/index.js +1 -0
- package/package.json +1 -1
- package/src/config.js +132 -113
- package/src/helpers.js +1 -1
- package/src/semantics.js +6 -1
package/client.js
CHANGED
@@ -15,14 +15,16 @@ const sortJson = runtime.sortJson
|
|
15
15
|
|
16
16
|
const getAsk = (config) => (uuid) => (asks) => {
|
17
17
|
for (let ask of asks) {
|
18
|
-
config.
|
18
|
+
config.addSemantic({
|
19
19
|
uuid,
|
20
|
+
oneShot: true,
|
20
21
|
match: (args) => ask.matchr(args),
|
21
22
|
apply: (args) => ask.applyr(args)
|
22
23
|
})
|
23
24
|
}
|
24
|
-
config.
|
25
|
+
config.addSemantic({
|
25
26
|
uuid,
|
27
|
+
oneShot: true,
|
26
28
|
match: ({context}) => context.marker == 'controlEnd' || context.marker == 'controlBetween',
|
27
29
|
apply: (args) => {
|
28
30
|
for (let ask of asks) {
|
@@ -37,7 +39,7 @@ const getAsk = (config) => (uuid) => (asks) => {
|
|
37
39
|
}
|
38
40
|
}
|
39
41
|
if (matchq(args)) {
|
40
|
-
args.context.motivationKeep = true
|
42
|
+
// args.context.motivationKeep = true
|
41
43
|
args.context.verbatim = applyq(args)
|
42
44
|
args.context.isResponse = true;
|
43
45
|
delete args.context.controlRemove;
|
@@ -144,7 +146,6 @@ const setupArgs = (args, config, logs, hierarchy) => {
|
|
144
146
|
apis: getAPIs(uuid)
|
145
147
|
}
|
146
148
|
}
|
147
|
-
args.motivation = (m) => config.addMotivation(m)
|
148
149
|
args.breakOnSemantics = false
|
149
150
|
args.theDebugger = {
|
150
151
|
breakOnSemantics: (value) => args.breakOnSemantics = value
|
@@ -420,18 +421,16 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
|
|
420
421
|
}
|
421
422
|
const generateParenthesized = isTest || (commandLineArgs && commandLineArgs.save)
|
422
423
|
if (!config.get('skipSemantics')) {
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
|
431
|
-
}
|
432
|
-
// contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
|
433
|
-
contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
|
424
|
+
const semantics = config.getSemantics(json.logs)
|
425
|
+
try {
|
426
|
+
contextPrime = semantics.apply(args, context)
|
427
|
+
} catch( e ) {
|
428
|
+
if (e.message == 'Maximum call stack size exceeded') {
|
429
|
+
const mostCalled = semantics.getMostCalled()
|
430
|
+
e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
|
434
431
|
}
|
432
|
+
// contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
|
433
|
+
contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
|
435
434
|
}
|
436
435
|
}
|
437
436
|
if (contextPrime.controlRemove) {
|
@@ -767,7 +766,6 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
767
766
|
testConfigName = testConfig.testModuleName
|
768
767
|
}
|
769
768
|
config.beforeQuery({ query: test, isModule: false, objects })
|
770
|
-
// config.resetMotivations()
|
771
769
|
try {
|
772
770
|
const result = await _process(config, test, { errorHandler, isTest: true })
|
773
771
|
result.query = test
|
@@ -785,12 +783,17 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
785
783
|
delete expected_objects.nameToUUID
|
786
784
|
const actual_objects = sortJson(convertToStable(config.config.objects), { depth: 25 })
|
787
785
|
const failed_paraphrases = !matching(result.paraphrases, expected.paraphrases)
|
788
|
-
|
789
|
-
|
786
|
+
let failed_paraphrasesParenthesized = !matching(result.paraphrasesParenthesized, expected.paraphrasesParenthesized)
|
787
|
+
let failed_generatedParenthesized = !matching(result.generatedParenthesized, expected.generatedParenthesized)
|
790
788
|
const failed_responses = !matching(result.responses, expected.responses)
|
791
789
|
const failed_contexts = !matching(result.contexts, expected.contexts)
|
792
790
|
const failed_objects = !matching(actual_objects, expected_objects)
|
793
791
|
|
792
|
+
if (args.testNoParenthesized) {
|
793
|
+
failed_paraphrasesParenthesized = false
|
794
|
+
failed_generatedParenthesized = false
|
795
|
+
}
|
796
|
+
|
794
797
|
const pickEm = (getObjects) => {
|
795
798
|
const picked = {}
|
796
799
|
for (let prop of (testConfig.check || [])) {
|
@@ -816,6 +819,11 @@ const runTest = async (config, expected, { args, verbose, afterTest, testConfig,
|
|
816
819
|
}
|
817
820
|
return expected.objects.namespaced[expected.objects.nameToUUID[name]]
|
818
821
|
}
|
822
|
+
try {
|
823
|
+
sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
824
|
+
} catch ( e ) {
|
825
|
+
debugger
|
826
|
+
}
|
819
827
|
const expected_checked = sortJson(pickEm(expectedGetObjects), { depth: 25 })
|
820
828
|
const actualGetObjects = (name) => {
|
821
829
|
if (!name) {
|
@@ -942,7 +950,6 @@ const runTests = async (config, testFile, juicyBits) => {
|
|
942
950
|
const saveTest = async (testFile, config, test, expected, testConfig, saveDeveloper) => {
|
943
951
|
config.rebuild()
|
944
952
|
const objects = getObjects(config.config.objects)(config.uuid)
|
945
|
-
//config.resetMotivations()
|
946
953
|
config.beforeQuery({ query: test, isModule: false, objects })
|
947
954
|
console.log(test)
|
948
955
|
const result = await _process(config, test, { isTest: true })
|
@@ -1215,7 +1222,7 @@ entodicton.knowledgeModule( {
|
|
1215
1222
|
`
|
1216
1223
|
*/
|
1217
1224
|
|
1218
|
-
const
|
1225
|
+
const rebuildTemplate = async ({ config, target, template, errorHandler = defaultErrorHandler }) => {
|
1219
1226
|
const accumulators = {
|
1220
1227
|
resultss: [],
|
1221
1228
|
fragments: [],
|
@@ -1239,8 +1246,6 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
|
|
1239
1246
|
if (property == 'fragments') {
|
1240
1247
|
global.transitoryMode = true
|
1241
1248
|
}
|
1242
|
-
// greg32
|
1243
|
-
// config.addInternal( query )
|
1244
1249
|
if (hierarchy) {
|
1245
1250
|
for (let edge of hierarchy) {
|
1246
1251
|
if (Array.isArray(edge)) {
|
@@ -1282,6 +1287,12 @@ const build = async ({ config, target, template, errorHandler = defaultErrorHand
|
|
1282
1287
|
// it will just get added to the config
|
1283
1288
|
const extraConfig = queryOrExtraConfig
|
1284
1289
|
console.log('config', extraConfig)
|
1290
|
+
try {
|
1291
|
+
config.addInternal(_.cloneDeep(extraConfig), { handleCalculatedProps: true } )
|
1292
|
+
} catch ( e ) {
|
1293
|
+
const where = extraConfig.where ? ` ${extraConfig.where}` : ''
|
1294
|
+
throw new Error(`Error processing extra config${where}: ${e.stack}}`)
|
1295
|
+
}
|
1285
1296
|
accumulators[property].push({ extraConfig: true, ...extraConfig })
|
1286
1297
|
await looper(queries)
|
1287
1298
|
}
|
@@ -1472,6 +1483,7 @@ const knowledgeModule = async ({
|
|
1472
1483
|
parser.add_argument('-t', '--test', { action: 'store_true', help: 'Run the tests. Create tests by running with the --query + --save flag' })
|
1473
1484
|
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' })
|
1474
1485
|
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' })
|
1486
|
+
parser.add_argument('-tnp', '--testNoParenthesized', { action: 'store_true', help: 'Don\' check parenthesized differences for the tests' })
|
1475
1487
|
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' })
|
1476
1488
|
// 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.' })
|
1477
1489
|
parser.add_argument('-rt', '--rebuildTemplate', { action: 'store_true', help: 'Force a template rebuild' })
|
@@ -1728,11 +1740,13 @@ const knowledgeModule = async ({
|
|
1728
1740
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1729
1741
|
hasError = true
|
1730
1742
|
}
|
1731
|
-
if (
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1735
|
-
|
1743
|
+
if (!args.testNoParenthesized) {
|
1744
|
+
if (JSON.stringify(result.expected.paraphrasesParenthesized) !== JSON.stringify(result.actual.paraphrasesParenthesized)) {
|
1745
|
+
hasError = true
|
1746
|
+
}
|
1747
|
+
if (JSON.stringify(result.expected.generatedParenthesized) !== JSON.stringify(result.actual.generatedParenthesized)) {
|
1748
|
+
hasError = true
|
1749
|
+
}
|
1736
1750
|
}
|
1737
1751
|
if (JSON.stringify(result.expected.responses) !== JSON.stringify(result.actual.responses)) {
|
1738
1752
|
hasError = true
|
@@ -1758,9 +1772,13 @@ const knowledgeModule = async ({
|
|
1758
1772
|
}
|
1759
1773
|
}
|
1760
1774
|
show('paraphrases', result.expected.paraphrases, result.actual.paraphrases)
|
1761
|
-
|
1775
|
+
if (!args.testNoParenthesized) {
|
1776
|
+
show('paraphrases parenthesized', result.expected.paraphrasesParenthesized, result.actual.paraphrasesParenthesized)
|
1777
|
+
}
|
1762
1778
|
show('responses', result.expected.responses, result.actual.responses)
|
1763
|
-
|
1779
|
+
if (!args.testNoParenthesized) {
|
1780
|
+
show('responses parenthesized', result.expected.generatedParenthesized, result.actual.generatedParenthesized)
|
1781
|
+
}
|
1764
1782
|
/*
|
1765
1783
|
if (JSON.stringify(result.expected.paraphrases) !== JSON.stringify(result.actual.paraphrases)) {
|
1766
1784
|
if (!headerShown) {
|
@@ -1934,7 +1952,7 @@ module.exports = {
|
|
1934
1952
|
w,
|
1935
1953
|
// submitBug,
|
1936
1954
|
ensureTestFile,
|
1937
|
-
|
1955
|
+
rebuildTemplate,
|
1938
1956
|
processContext,
|
1939
1957
|
processContexts,
|
1940
1958
|
runTests,
|
package/index.js
CHANGED
package/package.json
CHANGED
package/src/config.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
// lookup = (name) => returns <config>
|
2
2
|
const { Semantics, normalizeGenerator } = require('./semantics')
|
3
3
|
const { Generators } = require('./generators')
|
4
|
-
|
4
|
+
const { v4 : uuidv4 } = require('uuid');
|
5
5
|
const client = require('../client')
|
6
6
|
const DigraphInternal = require('./digraph_internal')
|
7
7
|
const helpers = require('./helpers')
|
@@ -30,6 +30,41 @@ const config_toServer = (config) => {
|
|
30
30
|
}
|
31
31
|
}
|
32
32
|
|
33
|
+
const validConfigProps = (config) => {
|
34
|
+
const valid = [
|
35
|
+
'hierarchy',
|
36
|
+
'objects',
|
37
|
+
'bridges',
|
38
|
+
'operators',
|
39
|
+
'words',
|
40
|
+
'priorities',
|
41
|
+
'contextual_priorities',
|
42
|
+
'associations',
|
43
|
+
'name',
|
44
|
+
'version',
|
45
|
+
'generators',
|
46
|
+
'semantics',
|
47
|
+
'where',
|
48
|
+
'floaters',
|
49
|
+
'debug',
|
50
|
+
|
51
|
+
// TODO Fix these from the test app
|
52
|
+
'implicits',
|
53
|
+
'convolution',
|
54
|
+
'expected_generated',
|
55
|
+
'expected_results',
|
56
|
+
'skipSemantics',
|
57
|
+
'description',
|
58
|
+
'contexts',
|
59
|
+
'utterances',
|
60
|
+
'flatten',
|
61
|
+
|
62
|
+
'namespaces',
|
63
|
+
'eqClasses',
|
64
|
+
]
|
65
|
+
helpers.validProps(valid, config, 'config')
|
66
|
+
}
|
67
|
+
|
33
68
|
const setupInitializerFNArgs = (config, args) => {
|
34
69
|
const aw = (word, def) => config.addWord(word, def, args.uuid)
|
35
70
|
const ag = (generator) => config.addGenerator(generator, args.uuid, config.name)
|
@@ -169,7 +204,7 @@ const handleBridgeProps = (config, bridge) => {
|
|
169
204
|
config.addWordInternal(def, {"id": bridge.id, "initial": `{ value: "${def}"}` })
|
170
205
|
} else {
|
171
206
|
const word = def.word
|
172
|
-
def = { initial: JSON.stringify(def), id: bridge.id, word
|
207
|
+
def = { initial: JSON.stringify(def), id: bridge.id, word }
|
173
208
|
config.addWordInternal(word, def)
|
174
209
|
}
|
175
210
|
}
|
@@ -249,7 +284,7 @@ const handleBridgeProps = (config, bridge) => {
|
|
249
284
|
const handleCalculatedProps = (baseConfig, moreConfig) => {
|
250
285
|
for (let bridge of moreConfig.bridges) {
|
251
286
|
const valid = [ 'after', 'before', 'bridge', 'development', 'evaluator', 'generatorp', 'generatorr', 'generatorpr', 'generators', 'id', 'convolution', 'inverted', 'isA', 'children', 'parents',
|
252
|
-
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where' ]
|
287
|
+
'level', 'optional', 'selector', 'semantic', 'words', /Bridge$/, 'localHierarchy', 'levelSpecificHierarchy', 'where', 'uuid' ]
|
253
288
|
helpers.validProps(valid, bridge, 'bridge')
|
254
289
|
handleBridgeProps(baseConfig, bridge)
|
255
290
|
}
|
@@ -357,6 +392,14 @@ const normalizeConfig = (config) => {
|
|
357
392
|
}
|
358
393
|
}
|
359
394
|
}
|
395
|
+
|
396
|
+
if (config.semantics) {
|
397
|
+
for (let semantic of config.semantics) {
|
398
|
+
if (semantic.oneShot) {
|
399
|
+
semantic.id = uuid()
|
400
|
+
}
|
401
|
+
}
|
402
|
+
}
|
360
403
|
}
|
361
404
|
}
|
362
405
|
|
@@ -564,8 +607,8 @@ const multiApiImpl = (initializer) => {
|
|
564
607
|
initializer(config, api)
|
565
608
|
const name = api.getName()
|
566
609
|
multiApi.apis[name] = api
|
567
|
-
api.objects = config.get('objects')
|
568
|
-
api.config = () => config
|
610
|
+
// api.objects = config.get('objects')
|
611
|
+
// api.config = () => config
|
569
612
|
multiApi.current = name
|
570
613
|
},
|
571
614
|
|
@@ -576,11 +619,13 @@ const multiApiImpl = (initializer) => {
|
|
576
619
|
}
|
577
620
|
},
|
578
621
|
|
622
|
+
/*
|
579
623
|
set objects (value) {
|
580
624
|
for (const key in Object.keys(this.apis)) {
|
581
625
|
this.apis[key].objects = value
|
582
626
|
}
|
583
627
|
},
|
628
|
+
*/
|
584
629
|
|
585
630
|
// "product1": apiInstance(testData1),
|
586
631
|
apis: {
|
@@ -598,7 +643,18 @@ class Config {
|
|
598
643
|
return config_toServer(config)
|
599
644
|
}
|
600
645
|
|
601
|
-
|
646
|
+
base () {
|
647
|
+
const base = new Config()
|
648
|
+
for (let km of this.configs.reverse()) {
|
649
|
+
if (km.isSelf) {
|
650
|
+
continue
|
651
|
+
}
|
652
|
+
base.add(km.config)
|
653
|
+
}
|
654
|
+
return base
|
655
|
+
}
|
656
|
+
|
657
|
+
getPseudoConfig (uuid, config) {
|
602
658
|
return {
|
603
659
|
description: "this is a pseudo config that has limited functionality due to being available in the initializer function context",
|
604
660
|
addAssociation: (...args) => this.addAssociation(...args),
|
@@ -612,6 +668,9 @@ class Config {
|
|
612
668
|
addSemantic: (...args) => this.addSemantic(...args, uuid, config.name),
|
613
669
|
addWord: (...args) => this.addWord(...args, uuid),
|
614
670
|
|
671
|
+
getHierarchy: (...args) => this.config.hierarchy,
|
672
|
+
getBridges: (...args) => this.config.bridges,
|
673
|
+
|
615
674
|
addArgs: (...args) => this.addArgs(...args),
|
616
675
|
getBridge: (...args) => this.getBridge(...args),
|
617
676
|
fragment: (...args) => this.fragment(...args),
|
@@ -887,7 +946,7 @@ class Config {
|
|
887
946
|
// TODO fix beforeQuery
|
888
947
|
template = { fragments: [], queries: [], ...template }
|
889
948
|
template.fragments = template.fragments.concat(this.dynamicFragments)
|
890
|
-
client.
|
949
|
+
client.rebuildTemplate({ config: this, target: this.name, beforeQuery: () => {}, template, ...options })
|
891
950
|
} else {
|
892
951
|
// no change
|
893
952
|
// this.initInstances.push({ ...instance, name: config.name })
|
@@ -1094,6 +1153,7 @@ class Config {
|
|
1094
1153
|
if (!(typeof semantic.match === 'function')) {
|
1095
1154
|
throw new Error('addSemantic: Expected match to be a function')
|
1096
1155
|
}
|
1156
|
+
|
1097
1157
|
if (!(typeof semantic.apply === 'function')) {
|
1098
1158
|
throw new Error('addSemantic: Expected apply to be a function')
|
1099
1159
|
}
|
@@ -1107,10 +1167,17 @@ class Config {
|
|
1107
1167
|
}
|
1108
1168
|
|
1109
1169
|
const semantics = this.config.semantics
|
1110
|
-
Object.assign(semantic, { uuid: uuid || this._uuid, km: name || this.name, index: semantics.length })
|
1170
|
+
Object.assign(semantic, { uuid: uuid || this._uuid, km: name || this.name, index: semantics.length, id: uuidv4() })
|
1111
1171
|
semantics.unshift(semantic)
|
1112
1172
|
}
|
1113
1173
|
|
1174
|
+
removeSemantic(deleteSemantic) {
|
1175
|
+
const index = this.config.semantics.findIndex( (semantic) => semantic.id === deleteSemantic.id )
|
1176
|
+
if (index >= 0) {
|
1177
|
+
this.config.semantics.splice(index, 1)
|
1178
|
+
}
|
1179
|
+
}
|
1180
|
+
|
1114
1181
|
addOperator (objectOrPattern, uuid) {
|
1115
1182
|
if (!this.config.operators) {
|
1116
1183
|
this.config.operators = []
|
@@ -1373,34 +1440,7 @@ class Config {
|
|
1373
1440
|
}
|
1374
1441
|
|
1375
1442
|
if (config) {
|
1376
|
-
|
1377
|
-
'hierarchy',
|
1378
|
-
'objects',
|
1379
|
-
'bridges',
|
1380
|
-
'operators',
|
1381
|
-
'words',
|
1382
|
-
'priorities',
|
1383
|
-
'contextual_priorities',
|
1384
|
-
'associations',
|
1385
|
-
'name',
|
1386
|
-
'version',
|
1387
|
-
'generators',
|
1388
|
-
'semantics',
|
1389
|
-
'floaters',
|
1390
|
-
'debug',
|
1391
|
-
|
1392
|
-
// TODO Fix these from the test app
|
1393
|
-
'implicits',
|
1394
|
-
'convolution',
|
1395
|
-
'expected_generated',
|
1396
|
-
'expected_results',
|
1397
|
-
'skipSemantics',
|
1398
|
-
'description',
|
1399
|
-
'contexts',
|
1400
|
-
'utterances',
|
1401
|
-
'flatten',
|
1402
|
-
]
|
1403
|
-
helpers.validProps(valid, config, 'config')
|
1443
|
+
validConfigProps(config)
|
1404
1444
|
|
1405
1445
|
config.operators = config.operators || []
|
1406
1446
|
config.bridges = config.bridges || []
|
@@ -1483,7 +1523,6 @@ class Config {
|
|
1483
1523
|
if (config) {
|
1484
1524
|
this.name = config.name
|
1485
1525
|
}
|
1486
|
-
this.motivations = []
|
1487
1526
|
this.loadOrder = new DigraphInternal()
|
1488
1527
|
this.wasInitialized = false
|
1489
1528
|
this.configs = []
|
@@ -1588,11 +1627,13 @@ class Config {
|
|
1588
1627
|
this._api.add(this, this._api, value)
|
1589
1628
|
} else {
|
1590
1629
|
this._api = _.cloneDeep(value)
|
1630
|
+
/*
|
1591
1631
|
if (this._api) {
|
1592
|
-
this._api.objects = this.config.objects
|
1593
|
-
this._api.config = () => this
|
1594
|
-
this._api.uuid = this._uuid
|
1632
|
+
// this._api.objects = this.config.objects
|
1633
|
+
// this._api.config = () => this
|
1634
|
+
// this._api.uuid = this._uuid
|
1595
1635
|
}
|
1636
|
+
*/
|
1596
1637
|
this.rebuild()
|
1597
1638
|
}
|
1598
1639
|
}
|
@@ -1635,40 +1676,6 @@ class Config {
|
|
1635
1676
|
// this.valid() init was not run because the kms are not all setup yet
|
1636
1677
|
}
|
1637
1678
|
|
1638
|
-
// motivation === { match, apply, uuid }
|
1639
|
-
addMotivation (motivation) {
|
1640
|
-
if (!motivation.uuid) {
|
1641
|
-
motivation.uuid = this.uuid
|
1642
|
-
}
|
1643
|
-
this.motivations.push(motivation)
|
1644
|
-
}
|
1645
|
-
|
1646
|
-
resetMotivations () {
|
1647
|
-
this.motivations = []
|
1648
|
-
}
|
1649
|
-
|
1650
|
-
doMotivations (args, context) {
|
1651
|
-
args = Object.assign({}, args, { context, api: this.api })
|
1652
|
-
// console.log('src/config doMotivations this.uuid', this.uuid)
|
1653
|
-
// args.objects = args.getObjects(this.uuid)
|
1654
|
-
const motivations = this.motivations
|
1655
|
-
this.motivations = []
|
1656
|
-
let done = false
|
1657
|
-
for (const motivation of motivations) {
|
1658
|
-
args.objects = args.getObjects(motivation.uuid)
|
1659
|
-
if (!done && motivation.match(args)) {
|
1660
|
-
motivation.apply(args)
|
1661
|
-
if (args.context.controlKeepMotivation || motivation.repeat) {
|
1662
|
-
this.motivations.push(motivation)
|
1663
|
-
}
|
1664
|
-
done = true
|
1665
|
-
} else {
|
1666
|
-
this.motivations.push(motivation)
|
1667
|
-
}
|
1668
|
-
}
|
1669
|
-
return done
|
1670
|
-
}
|
1671
|
-
|
1672
1679
|
// TODO add more details
|
1673
1680
|
equal(config) {
|
1674
1681
|
if (JSON.stringify(this.config) != JSON.stringify(config.config)) {
|
@@ -1682,6 +1689,9 @@ class Config {
|
|
1682
1689
|
runtime.fs.writeFileSync(fn, JSON.stringify(this.config, 0, 2))
|
1683
1690
|
}
|
1684
1691
|
|
1692
|
+
copy (options = { callInitializers: true }) {
|
1693
|
+
}
|
1694
|
+
|
1685
1695
|
copy (options = { callInitializers: true }) {
|
1686
1696
|
this.valid()
|
1687
1697
|
const cp = new Config()
|
@@ -1699,7 +1709,6 @@ class Config {
|
|
1699
1709
|
cp.name = this.name
|
1700
1710
|
cp.description = this.description
|
1701
1711
|
cp.tests = this.tests
|
1702
|
-
cp.motivations = [...this.motivations]
|
1703
1712
|
cp.isModule = this.isModule
|
1704
1713
|
cp.loadedForTesting = this.loadedForTesting
|
1705
1714
|
cp.initInstances = this.initInstances.slice()
|
@@ -1724,25 +1733,38 @@ class Config {
|
|
1724
1733
|
}
|
1725
1734
|
cp.mapUUIDs(map)
|
1726
1735
|
|
1736
|
+
if (cp._uuid == 'concept2') {
|
1737
|
+
// debugger
|
1738
|
+
}
|
1727
1739
|
if (options.callInitializers) {
|
1728
1740
|
cp.rebuild(options)
|
1729
|
-
}
|
1730
|
-
|
1731
|
-
|
1732
|
-
cp._api
|
1733
|
-
|
1734
|
-
|
1741
|
+
} else {
|
1742
|
+
// this mess is for duplicate into a KM after resetToOne was called
|
1743
|
+
/*
|
1744
|
+
if (cp._api) {
|
1745
|
+
// cp._api.objects = cp.config.objects
|
1746
|
+
// cp._api.config = () => (cp instanceof Config) ? cp : cp.config
|
1747
|
+
// cp._api.uuid = cp._uuid
|
1748
|
+
}
|
1749
|
+
*/
|
1735
1750
|
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1751
|
+
if (!cp.config.objects) {
|
1752
|
+
cp.config.objects = { namespaced: {} }
|
1753
|
+
} else if (!cp.config.objects.namespaced) {
|
1754
|
+
cp.config.objects.namespaced = {}
|
1755
|
+
}
|
1756
|
+
cp.configs.forEach((km) => {
|
1757
|
+
// const namespace = km.namespace
|
1758
|
+
cp.config.objects.namespaced[km._uuid] = {}
|
1759
|
+
})
|
1760
|
+
/*
|
1761
|
+
if (cp._uuid == 'concept2') {
|
1762
|
+
if (!cp.api.objects.defaultTypesForHierarchy) {
|
1763
|
+
debugger
|
1764
|
+
}
|
1765
|
+
}
|
1766
|
+
*/
|
1740
1767
|
}
|
1741
|
-
cp.configs.forEach((km) => {
|
1742
|
-
// const namespace = km.namespace
|
1743
|
-
cp.config.objects.namespaced[km._uuid] = {}
|
1744
|
-
})
|
1745
|
-
|
1746
1768
|
cp.valid()
|
1747
1769
|
return cp
|
1748
1770
|
}
|
@@ -1844,17 +1866,21 @@ class Config {
|
|
1844
1866
|
const objects = {}
|
1845
1867
|
if (config instanceof Config) {
|
1846
1868
|
this.get('objects').namespaced[config._uuid] = objects
|
1869
|
+
/*
|
1847
1870
|
if (config._api) {
|
1848
|
-
config._api.objects = objects
|
1849
|
-
config._api.config = () => this
|
1871
|
+
// config._api.objects = objects
|
1872
|
+
// config._api.config = () => this
|
1850
1873
|
}
|
1874
|
+
*/
|
1851
1875
|
config.initializerFn(setupInitializerFNArgs(this, { testConfig: config, currentConfig: config, objects, namespace, uuid }))
|
1852
1876
|
} else {
|
1853
1877
|
this.get('objects').namespaced[this._uuid] = objects
|
1878
|
+
/*
|
1854
1879
|
if (config._api) {
|
1855
|
-
config._api.objects = objects
|
1856
|
-
config._api.config = () => this
|
1880
|
+
// config._api.objects = objects
|
1881
|
+
// config._api.config = () => this
|
1857
1882
|
}
|
1883
|
+
*/
|
1858
1884
|
this.initializerFn(setupInitializerFNArgs(this, { testConfig: this, currentConfig: this, objects, namespace, uuid }))
|
1859
1885
|
}
|
1860
1886
|
})
|
@@ -1885,14 +1911,6 @@ class Config {
|
|
1885
1911
|
// const baseConfig = args.baseConfig
|
1886
1912
|
const currentConfig = args.currentConfig
|
1887
1913
|
|
1888
|
-
if (currentConfig.api) {
|
1889
|
-
currentConfig.api.objects = args.objects
|
1890
|
-
// GREG42 currentConfig.api.config = () => this
|
1891
|
-
currentConfig.api.config = () => args.baseConfig
|
1892
|
-
currentConfig.api.uuid = currentConfig._uuid
|
1893
|
-
}
|
1894
|
-
// this.instances.forEach( (instance) => client.processInstance(this, instance) )
|
1895
|
-
// greg55
|
1896
1914
|
if (args.isAfterApi) {
|
1897
1915
|
fn(args)
|
1898
1916
|
}
|
@@ -2062,7 +2080,6 @@ class Config {
|
|
2062
2080
|
}
|
2063
2081
|
this.config.objects.namespaced = {}
|
2064
2082
|
this.resetWasInitialized()
|
2065
|
-
this.resetMotivations()
|
2066
2083
|
|
2067
2084
|
// reorder configs base on load ordering
|
2068
2085
|
{
|
@@ -2123,19 +2140,20 @@ class Config {
|
|
2123
2140
|
uuid: config._uuid,
|
2124
2141
|
objects: namespacedObjects,
|
2125
2142
|
namespace,
|
2126
|
-
motivation: (m) => this.addMotivation(m),
|
2127
2143
|
api: config.api,
|
2128
2144
|
}))
|
2129
2145
|
|
2130
2146
|
const currentConfig = args.currentConfig
|
2131
2147
|
|
2148
|
+
/*
|
2132
2149
|
if (args.currentConfig.api) {
|
2133
|
-
args.currentConfig.api.objects = args.objects
|
2150
|
+
// args.currentConfig.api.objects = args.objects
|
2134
2151
|
// TODO assign pseudo config?
|
2135
|
-
args.currentConfig.api.config = () => args.baseConfig
|
2136
|
-
args.currentConfig.api.uuid = args.currentConfig._uuid
|
2152
|
+
// args.currentConfig.api.config = () => args.baseConfig
|
2153
|
+
// args.currentConfig.api.uuid = args.currentConfig._uuid
|
2137
2154
|
args.currentConfig.wasInitialized = true
|
2138
2155
|
}
|
2156
|
+
*/
|
2139
2157
|
// debugger
|
2140
2158
|
// greg55
|
2141
2159
|
config.initializerFn(args, { dontCallFn: true })
|
@@ -2143,16 +2161,17 @@ class Config {
|
|
2143
2161
|
if (config._api) {
|
2144
2162
|
if (config._api.initialize) {
|
2145
2163
|
// reverse the list
|
2146
|
-
|
2164
|
+
// TODO sync up the args with initialize of config
|
2165
|
+
inits.unshift( () => config._api.initialize({ config: this, km: kmFn, ...args, api: config._api }) )
|
2147
2166
|
// config._api.initialize({ config, api: config._api })
|
2148
2167
|
} else {
|
2149
2168
|
if (interleaved) {
|
2150
2169
|
inits.unshift(null)
|
2151
2170
|
}
|
2152
2171
|
}
|
2153
|
-
config._api.objects = namespacedObjects
|
2154
|
-
config._api.config = () => this
|
2155
|
-
config._api.uuid = config._uuid
|
2172
|
+
// config._api.objects = namespacedObjects
|
2173
|
+
// config._api.config = () => this
|
2174
|
+
// config._api.uuid = config._uuid
|
2156
2175
|
} else {
|
2157
2176
|
if (interleaved) {
|
2158
2177
|
inits.unshift(null)
|
@@ -2240,7 +2259,6 @@ class Config {
|
|
2240
2259
|
}
|
2241
2260
|
this.hierarchy.edges = this.config.hierarchy
|
2242
2261
|
}
|
2243
|
-
// this.instances.forEach((instance) => client.processInstance(this, instance))
|
2244
2262
|
}
|
2245
2263
|
|
2246
2264
|
if (reverseIt) {
|
@@ -2639,6 +2657,7 @@ class Config {
|
|
2639
2657
|
|
2640
2658
|
// TODO get rid of useOldVersion arg
|
2641
2659
|
addInternal (more, { useOldVersion = true, skipObjects = false, includeNamespaces = true, allowNameToBeNull = false, handleCalculatedProps : hcps = false } = {}) {
|
2660
|
+
validConfigProps(more)
|
2642
2661
|
if (more instanceof Config) {
|
2643
2662
|
more.initialize({ force: false })
|
2644
2663
|
if (useOldVersion) {
|
@@ -2736,7 +2755,7 @@ class Config {
|
|
2736
2755
|
this.config[key].splice(iOldOne, 1)
|
2737
2756
|
break;
|
2738
2757
|
}
|
2739
|
-
}
|
2758
|
+
}
|
2740
2759
|
}
|
2741
2760
|
}
|
2742
2761
|
}
|
package/src/helpers.js
CHANGED
package/src/semantics.js
CHANGED
@@ -6,7 +6,7 @@ class Semantic {
|
|
6
6
|
// constructor ({match, apply, uuid, index, km, notes}) {
|
7
7
|
constructor (semantic) {
|
8
8
|
semantic = normalizeSemantic(semantic)
|
9
|
-
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property } = semantic
|
9
|
+
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property, oneShot, id } = semantic
|
10
10
|
this.matcher = match
|
11
11
|
this._apply = apply
|
12
12
|
this._applyWrapped = applyWrapped
|
@@ -18,6 +18,8 @@ class Semantic {
|
|
18
18
|
this.notes = notes
|
19
19
|
this.callId = debug
|
20
20
|
this.where = where
|
21
|
+
this.oneShot = oneShot
|
22
|
+
this.id = id
|
21
23
|
}
|
22
24
|
|
23
25
|
toLabel () {
|
@@ -197,6 +199,9 @@ class Semantics {
|
|
197
199
|
const log = (message) => { this.logs.push(message) }
|
198
200
|
try {
|
199
201
|
contextPrime = semantic.apply(args, context, s, log, options)
|
202
|
+
if (!contextPrime.controlKeepMotivation && semantic.oneShot) {
|
203
|
+
args.config.removeSemantic(semantic)
|
204
|
+
}
|
200
205
|
} catch( e ) {
|
201
206
|
contextPrime = null
|
202
207
|
let errorMessage
|