occam-verify-cli 0.0.705 → 0.0.707

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.
@@ -339,14 +339,14 @@ export default class ReleaseContext {
339
339
 
340
340
  fatal(message, node = null, tokens = null, filePath = null) { this.log.fatal(message, node, tokens, filePath); }
341
341
 
342
- initialise(dependencyReleaseContexts) {
343
- const releaseContext = this, ///
344
- releaseContexts = [
345
- releaseContext,
346
- ...dependencyReleaseContexts
347
- ],
348
- combinedCustomGrammar = combinedCustomGrammarFromReleaseContexts(releaseContexts),
349
- florenceLexer = florenceLexerFromCombinedCustomGrammar(combinedCustomGrammar),
342
+ initialise(releaseContexts) {
343
+ releaseContexts = releaseContexts.slice(); ///
344
+
345
+ const combinedCustomGrammar = combinedCustomGrammarFromReleaseContexts(releaseContexts),
346
+ releaseContext = releaseContexts.shift(),
347
+ dependencyReleaseContexts = releaseContexts; ///
348
+
349
+ const florenceLexer = florenceLexerFromCombinedCustomGrammar(combinedCustomGrammar),
350
350
  florenceParser = florenceParserFromCombinedCustomGrammar(combinedCustomGrammar);
351
351
 
352
352
  this.lexer = florenceLexer; ///
package/src/index.js CHANGED
@@ -6,4 +6,6 @@ export { default as verifyRelease } from "./verify/release";
6
6
  export { default as ReleaseContext } from "./context/release";
7
7
 
8
8
  export { default as customGrammarUtilities } from "./utilities/customGrammar";
9
- export { default as releaseContextUtilities } from "./utilities/releaseContext";
9
+
10
+ export { default as createReleaseContext } from "./releaseContext/create";
11
+ export { default as initialiseReleaseContext } from "./releaseContext/initialise";
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ import { last } from "../utilities/array";
4
+
5
+ export default function createReleaseContext(dependency, dependentNames, context, callback) {
6
+ const { log, releaseContextMap } = context,
7
+ dependencyName = dependency.getName(),
8
+ releaseName = dependencyName, ///
9
+ releaseContext = releaseContextMap[releaseName] || null;
10
+
11
+ if (releaseContext !== null) {
12
+ const error = null;
13
+
14
+ callback(error);
15
+
16
+ return;
17
+ }
18
+
19
+ log.info(`Creating the '${releaseName}' context.`)
20
+
21
+ const { releaseContextFromDependency } = context;
22
+
23
+ releaseContextFromDependency(dependency, context, (error, releaseContext) => {
24
+ if (error) {
25
+ callback(error);
26
+
27
+ return;
28
+ }
29
+
30
+ const releaseContextCreated = checkReleaseContextCreated(releaseContext, dependency, context);
31
+
32
+ if (!releaseContextCreated) {
33
+ const error = null;
34
+
35
+ callback(error);
36
+
37
+ return;
38
+ }
39
+
40
+ const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
41
+
42
+ if (!releaseMatchesDependency) {
43
+ const error = null;
44
+
45
+ callback(error);
46
+
47
+ return;
48
+ }
49
+
50
+ releaseContextMap[releaseName] = releaseContext;
51
+
52
+ createDependencyReleaseContexts(dependency, dependentNames, context, callback);
53
+ }, context);
54
+ }
55
+
56
+ function checkReleaseContextCreated(releaseContext, dependency, context) {
57
+ const releaseContextCreated = (releaseContext !== null);
58
+
59
+ if (!releaseContextCreated) {
60
+ const { log } = context,
61
+ dependencyName = dependency.getName(),
62
+ releaseName = dependencyName; ///
63
+
64
+ log.error(`The '${releaseName}' context could not be created.`);
65
+ }
66
+
67
+ return releaseContextCreated;
68
+ }
69
+
70
+ function checkCyclicDependencyExists(dependency, dependentNames, context) {
71
+ const dependencyName = dependency.getName(),
72
+ dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
73
+ cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
74
+
75
+ if (cyclicDependencyExists) {
76
+ const { log } = context,
77
+ firstDependentName = first(dependentNames),
78
+ dependencyNames = [ ///
79
+ ...dependentNames,
80
+ firstDependentName
81
+ ],
82
+ dependencyNamesString = dependencyNames.join(`' -> '`);
83
+
84
+ log.error(`There is a cyclic dependency: '${dependencyNamesString}'.`);
85
+ }
86
+
87
+ return cyclicDependencyExists;
88
+ }
89
+
90
+ function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
91
+ let releaseMatchesDependency = true;
92
+
93
+ const entries = releaseContext.getEntries(),
94
+ shortenedVersion = dependency.getShortedVersion();
95
+
96
+ if (shortenedVersion !== null) {
97
+ const entriesMatchShortenedVersion = entries.matchShortenedVersion(shortenedVersion);
98
+
99
+ if (!entriesMatchShortenedVersion) {
100
+ const { log } = context,
101
+ version = releaseContext.getVersion(),
102
+ versionString = version.toString(),
103
+ lastDependentName = last(dependentNames),
104
+ dependentName = lastDependentName, ///
105
+ dependencyName = dependency.getName(),
106
+ shortenedVersion = dependency.getShortedVersion(),
107
+ shortenedVersionString = shortenedVersion.toString();
108
+
109
+ log.error(`Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`);
110
+
111
+ releaseMatchesDependency = false;
112
+ }
113
+ }
114
+
115
+ return releaseMatchesDependency;
116
+ }
117
+
118
+ function createDependencyReleaseContexts(dependency, dependentNames, context, callback) {
119
+ const { releaseContextMap } = context,
120
+ dependencyName = dependency.getName(),
121
+ releaseName = dependencyName, ///
122
+ releaseContext = releaseContextMap[releaseName],
123
+ dependencies = releaseContext.getDependencies();
124
+
125
+ dependentNames = [ ...dependentNames, dependencyName ]; ///
126
+
127
+ dependencies.asynchronousForEachDependency((dependency, next, done) => {
128
+ const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames);
129
+
130
+ if (cyclicDependencyExists) {
131
+ const error = null;
132
+
133
+ callback(error);
134
+
135
+ return;
136
+ }
137
+
138
+ createReleaseContext(dependency, dependentNames, context, (error) => {
139
+ if (error) {
140
+ callback(error);
141
+
142
+ return;
143
+ }
144
+
145
+ next();
146
+ });
147
+ }, done);
148
+
149
+ function done() {
150
+ const error = null;
151
+
152
+ callback(error);
153
+ }
154
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ export default function initialiseReleaseContext(dependency, dependentName, dependentReleased, context) {
4
+ let releaseContextInitialised = false;
5
+
6
+ const { releaseContextMap } = context,
7
+ dependencyName = dependency.getName(),
8
+ releaseName = dependencyName, ///
9
+ releaseContext = releaseContextMap[releaseName] || null;
10
+
11
+ if (releaseContext === null) {
12
+ const { log } = context;
13
+
14
+ log.error(`Unable to initialise the '${dependencyName}' dependency's context because it has not been created.`);
15
+ } else {
16
+ const initialised = releaseContext.isInitialised();
17
+
18
+ if (initialised) {
19
+ releaseContextInitialised = true;
20
+ } else {
21
+ const released = releaseContext.isReleased();
22
+
23
+ if (!released && dependentReleased) {
24
+ const { log } = context;
25
+
26
+ log.error(`Unable to initialise the '${dependencyName}' dependency's context because its '${dependentName}' dependent is a package.`);
27
+ } else {
28
+ const dependencies = releaseContext.getDependencies();
29
+
30
+ dependentName = dependencyName; ///
31
+
32
+ dependentReleased = released; ///
33
+
34
+ releaseContextInitialised = dependencies.everyDependency((dependency) => { ///
35
+ const releaseContextInitialised = initialiseReleaseContext(dependency, dependentName, dependentReleased, context);
36
+
37
+ if (releaseContextInitialised) {
38
+ return true;
39
+ }
40
+ });
41
+
42
+ if (releaseContextInitialised) {
43
+ const releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap);
44
+
45
+ releaseContext.initialise(releaseContexts);
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ return releaseContextInitialised;
52
+ }
53
+
54
+ function retrieveReleaseContexts(releaseContext, releaseContextMap) {
55
+ const releaseContexts = [],
56
+ remainingReleaseContext = releaseContext, ///
57
+ remainingReleaseContexts = [
58
+ remainingReleaseContext
59
+ ];
60
+
61
+ let remainingReleaseContextsLength = remainingReleaseContexts.length;
62
+
63
+ while (remainingReleaseContextsLength > 0) {
64
+ const remainingReleaseContext = remainingReleaseContexts.shift(),
65
+ releaseContext = remainingReleaseContext; ///
66
+
67
+ releaseContexts.push(releaseContext);
68
+
69
+ const dependencies = releaseContext.getDependencies();
70
+
71
+ dependencies.forEachDependency((dependency) => {
72
+ const dependencyName = dependency.getName(),
73
+ releaseName = dependencyName, ///
74
+ releaseContext = releaseContextMap[releaseName],
75
+ releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext),
76
+ remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
77
+
78
+ if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
79
+ const remainingReleaseContext = releaseContext; ///
80
+
81
+ remainingReleaseContexts.push(remainingReleaseContext);
82
+ }
83
+ });
84
+
85
+ remainingReleaseContextsLength = remainingReleaseContexts.length;
86
+ }
87
+
88
+ return releaseContexts;
89
+ }
package/src/ruleNames.js CHANGED
@@ -3,11 +3,9 @@
3
3
  export const TERM_RULE_NAME = "term";
4
4
  export const TYPE_RULE_NAME = "type";
5
5
  export const LABEL_RULE_NAME = "label";
6
- export const VARIABLE_RULE_NAME = "variable";
7
6
  export const ARGUMENT_RULE_NAME = "argument";
8
7
  export const SUBPROOF_RULE_NAME = "subproof";
9
8
  export const STATEMENT_RULE_NAME = "statement";
10
- export const META_TYPE_RULE_NAME = "meta-type";
11
9
  export const METAVARIABLE_RULE_NAME = "metavariable";
12
10
  export const METASTATEMENT_RULE_NAME = "metastatement";
13
11
  export const RULE_SUBPROOF_RULE_NAME = "ruleSubproof";
@@ -17,5 +15,4 @@ export const VARIABLE_DECLARATION_RULE_NAME = "variableDeclaration";
17
15
  export const UNQUALIFIED_STATEMENT_RULE_NAME = "unqualifiedStatement";
18
16
  export const CONSTRUCTOR_DECLARATION_RULE_NAME = "constructorDeclaration";
19
17
  export const QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement";
20
- export const METAVARIABLE_DECLARATION_RULE_NAME = "metavariableDeclaration";
21
18
  export const UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
@@ -73,3 +73,31 @@ export function rightDifference(arrayA, arrayB) {
73
73
  }
74
74
  });
75
75
  }
76
+
77
+ export function areArraysEqual(arrayA, arrayB, callback) {
78
+ if (callback === undefined) {
79
+ callback = (elementA, elementB) => {
80
+ if (elementA === elementB) {
81
+ return true;
82
+ }
83
+ };
84
+ }
85
+
86
+ let arraysEqual = false;
87
+
88
+ const arrayALength = arrayA.length,
89
+ arrayBLength = arrayB.length;
90
+
91
+ if (arrayALength === arrayBLength) {
92
+ arraysEqual = arrayA.every((elementA, index) => {
93
+ const elementB = arrayB[index],
94
+ result = callback(elementA, elementB);
95
+
96
+ if (result) {
97
+ return true;
98
+ }
99
+ })
100
+ }
101
+
102
+ return arraysEqual;
103
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ import { areArraysEqual } from "../utilities/array";
4
+
5
+ export function terminalNodeMapFromNodes(nodes) {
6
+ const terminalNodeMap = {};
7
+
8
+ nodes.forEach((node, index) => {
9
+ const nodeTerminalNode = node.isTerminalNode();
10
+
11
+ if (nodeTerminalNode) {
12
+ const terminalNode = node; //
13
+
14
+ terminalNodeMap[index] = terminalNode;
15
+ }
16
+ });
17
+
18
+ return terminalNodeMap;
19
+ }
20
+
21
+ export function areTerminalNodeMapsEqual(terminalNodeMapA, terminalNodeMapB) {
22
+ let terminalNodeMapsEqual = false;
23
+
24
+ const indexesA = Object.keys(terminalNodeMapA), ///
25
+ indexesB = Object.keys(terminalNodeMapB), ///
26
+ terminalNodeMapKeysEqual = areArraysEqual(indexesA, indexesB);
27
+
28
+ if (terminalNodeMapKeysEqual) {
29
+ const terminalNodesA = Object.keys(terminalNodeMapA), ///
30
+ terminalNodesB = Object.keys(terminalNodeMapB), ///
31
+ terminalNodeMapValuesEqual = areArraysEqual(terminalNodesA, terminalNodesB, (terminalNodeA, terminalNodeB) => {
32
+ const matches = terminalNodeA.match(terminalNodeB);
33
+
34
+ if (matches) {
35
+ return true;
36
+ }
37
+ });
38
+
39
+ terminalNodeMapsEqual = terminalNodeMapValuesEqual; ///
40
+ }
41
+
42
+ return terminalNodeMapsEqual;
43
+ }
@@ -32,6 +32,28 @@ export default class NodeVerifier {
32
32
  return childNodesVerify;
33
33
  }
34
34
 
35
+ verifyTerminalNode(terminalNode, ...remainingArguments) {
36
+ let terminalNodeVerified;
37
+
38
+ const verifyAhead = remainingArguments.pop(), ///
39
+ verifiedAhead = verifyAhead(); ///
40
+
41
+ terminalNodeVerified = verifiedAhead; ///
42
+
43
+ return terminalNodeVerified;
44
+ }
45
+
46
+ verifyNonTerminalNode(nonTerminalNode, ...remainingArguments) {
47
+ let nonTerminalNodeVerified;
48
+
49
+ const childNodes = nonTerminalNode.getChildNodes(), ///
50
+ childNodesVerify = this.verifyChildNodes(childNodes, ...remainingArguments);
51
+
52
+ nonTerminalNodeVerified = childNodesVerify; ///
53
+
54
+ return nonTerminalNodeVerified;
55
+ }
56
+
35
57
  verifyChildNodesAhead(index, childNodes, ...remainingArguments) {
36
58
  let childNodesVerify;
37
59
 
@@ -46,11 +68,10 @@ export default class NodeVerifier {
46
68
  const childNode = childNodes[index],
47
69
  node = childNode, ///
48
70
  nodeVerified = this.verifyNode(node, ...remainingArguments, () => {
49
- index++;
50
-
51
71
  remainingArguments.push(verifyAhead);
52
72
 
53
- const childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodes, ...remainingArguments);
73
+ const aheadIndex = index + 1,
74
+ childNodesVerifyAhead = this.verifyChildNodesAhead(aheadIndex, childNodes, ...remainingArguments);
54
75
 
55
76
  return childNodesVerifyAhead;
56
77
  });
@@ -60,26 +81,4 @@ export default class NodeVerifier {
60
81
 
61
82
  return childNodesVerify;
62
83
  }
63
-
64
- verifyTerminalNode(terminalNode, ...remainingArguments) {
65
- let terminalNodeVerified;
66
-
67
- const verifyAhead = remainingArguments.pop(), ///
68
- verifiedAhead = verifyAhead(); ///
69
-
70
- terminalNodeVerified = verifiedAhead; ///
71
-
72
- return terminalNodeVerified;
73
- }
74
-
75
- verifyNonTerminalNode(nonTerminalNode, ...remainingArguments) {
76
- let nonTerminalNodeVerified;
77
-
78
- const childNodes = nonTerminalNode.getChildNodes(), ///
79
- childNodesVerify = this.verifyChildNodes(childNodes, ...remainingArguments);
80
-
81
- nonTerminalNodeVerified = childNodesVerify; ///
82
-
83
- return nonTerminalNodeVerified;
84
- }
85
84
  }
@@ -98,3 +98,4 @@ class TermNodesVerifier extends NodesVerifier {
98
98
  const termNodesVerifier = new TermNodesVerifier();
99
99
 
100
100
  export default termNodesVerifier;
101
+
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual } from "../utilities/terminalNodes";
4
+
3
5
  export default class NodesVerifier {
4
6
  verifyNode(nodeA, nodeB, ...remainingArguments) {
5
7
  let nodeVerified = false;
@@ -35,15 +37,51 @@ export default class NodesVerifier {
35
37
  childNodesBLength = childNodesB.length;
36
38
 
37
39
  if (childNodesALength === childNodesBLength) {
38
- const index = 0,
39
- childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
40
+ const childTerminalNodeMapA = terminalNodeMapFromNodes(childNodesA),
41
+ childTerminalNodeMapB = terminalNodeMapFromNodes(childNodesB),
42
+ terminalNodeMapsEqual = areTerminalNodeMapsEqual(childTerminalNodeMapA, childTerminalNodeMapB);
43
+
44
+ if (terminalNodeMapsEqual) {
45
+ const index = 0,
46
+ childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
40
47
 
41
- childNodesVerify = childNodesVerifyAhead; ///
48
+ childNodesVerify = childNodesVerifyAhead; ///
49
+ }
42
50
  }
43
51
 
44
52
  return childNodesVerify;
45
53
  }
46
54
 
55
+ verifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) { ///
56
+ let terminalNodeVerified;
57
+
58
+ const verifyAhead = remainingArguments.pop(),
59
+ verifiedAhead = verifyAhead();
60
+
61
+ terminalNodeVerified = verifiedAhead; ///
62
+
63
+ return terminalNodeVerified;
64
+ }
65
+
66
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
67
+ let nonTerminalNodeVerified = false;
68
+
69
+ const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
70
+ nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
71
+
72
+ if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
73
+ const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
74
+ nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
75
+ childNodesA = nonTerminalNodeAChildNodes, ///
76
+ childNodesB = nonTerminalNodeBChildNodes, ///
77
+ childNodesVerify = this.verifyChildNodes(childNodesA, childNodesB, ...remainingArguments);
78
+
79
+ nonTerminalNodeVerified = childNodesVerify; ///
80
+ }
81
+
82
+ return nonTerminalNodeVerified;
83
+ }
84
+
47
85
  verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments) {
48
86
  let childNodesVerify;
49
87
 
@@ -60,11 +98,10 @@ export default class NodesVerifier {
60
98
  nodeA = childNodeA, ///
61
99
  nodeB = childNodeB, ///
62
100
  nodeVerified = this.verifyNode(nodeA, nodeB, ...remainingArguments, () => {
63
- index++;
64
-
65
101
  remainingArguments.push(verifyAhead); ///
66
102
 
67
- const childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
103
+ const aheadIndex = index + 1,
104
+ childNodesVerifyAhead = this.verifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
68
105
 
69
106
  return childNodesVerifyAhead;
70
107
  });
@@ -74,38 +111,4 @@ export default class NodesVerifier {
74
111
 
75
112
  return childNodesVerify;
76
113
  }
77
-
78
- verifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) {
79
- let terminalNodeVerified = false;
80
-
81
- const matches = terminalNodeA.match(terminalNodeB);
82
-
83
- if (matches) {
84
- const verifyAhead = remainingArguments.pop(),
85
- verifiedAhead = verifyAhead();
86
-
87
- terminalNodeVerified = verifiedAhead; ///
88
- }
89
-
90
- return terminalNodeVerified;
91
- }
92
-
93
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
94
- let nonTerminalNodeVerified = false;
95
-
96
- const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
97
- nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
98
-
99
- if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
100
- const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
101
- nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
102
- childNodesA = nonTerminalNodeAChildNodes, ///
103
- childNodesB = nonTerminalNodeBChildNodes, ///
104
- childNodesVerify = this.verifyChildNodes(childNodesA, childNodesB, ...remainingArguments);
105
-
106
- nonTerminalNodeVerified = childNodesVerify; ///
107
- }
108
-
109
- return nonTerminalNodeVerified;
110
- }
111
114
  }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ export default function verifyGivenVariable(variableNode, variables, context, verifyAhead) {
4
+ let givenVariableVerified = false;
5
+
6
+ const variableString = context.nodeAsString(variableNode);
7
+
8
+ context.trace(`Verifying the '${variableString}' given variable...`, variableNode);
9
+
10
+ const variable = context.findVariableByVariableNode(variableNode);
11
+
12
+ if (variable !== null) {
13
+ let verifiedAhead;
14
+
15
+ variables.push(variable);
16
+
17
+ verifiedAhead = verifyAhead();
18
+
19
+ if (!verifiedAhead) {
20
+ variables.pop();
21
+ }
22
+
23
+ givenVariableVerified = verifiedAhead; ///
24
+ }
25
+
26
+ if (givenVariableVerified) {
27
+ context.debug(`...verified the '${variableString}' given variable.`, variableNode);
28
+ }
29
+
30
+ return givenVariableVerified;
31
+ }