remove engine dependency; use api
This commit is contained in:
parent
3a15804fda
commit
77dd5b4944
|
@ -24,6 +24,10 @@ class ContractsManager {
|
|||
cb(self.compileError, self.listContracts());
|
||||
});
|
||||
|
||||
self.events.setCommandHandler('contracts:dependencies', (cb) => {
|
||||
cb(self.compileError, self.contractDependencies);
|
||||
});
|
||||
|
||||
self.events.setCommandHandler("contracts:contract", (contractName, cb) => {
|
||||
cb(self.getContract(contractName));
|
||||
});
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
const async = require('async');
|
||||
const Viz = require('viz.js');
|
||||
const fs = require('fs');
|
||||
|
||||
|
@ -13,36 +14,52 @@ class GraphGenerator {
|
|||
}
|
||||
|
||||
generate(options) {
|
||||
const self = this;
|
||||
let id = 0;
|
||||
let contractString = "";
|
||||
let relationshipString = "";
|
||||
let idMapping = {};
|
||||
let contractInheritance = {};
|
||||
let contracts = {};
|
||||
let contractsDependencies = {};
|
||||
|
||||
for (let contract in this.engine.contractsManager.contracts) {
|
||||
if(options.skipUndeployed && !this.engine.contractsManager.contracts[contract].deploy) continue;
|
||||
async.waterfall([
|
||||
function getContractList(next) {
|
||||
self.events.request('contracts:list', (err, _contracts) => {
|
||||
contracts = _contracts;
|
||||
next();
|
||||
});
|
||||
},
|
||||
function getContractsDependencies(next) {
|
||||
self.events.request('contracts:dependencies', (err, _contractsDependencies) => {
|
||||
contractsDependencies = _contractsDependencies;
|
||||
next();
|
||||
});
|
||||
},
|
||||
function (next) {
|
||||
for (let contract of contracts) {
|
||||
if (options.skipUndeployed && !contract.deploy) continue;
|
||||
|
||||
id++;
|
||||
|
||||
idMapping[contract] = id;
|
||||
idMapping[contract.className] = id;
|
||||
|
||||
let contractLabel = "";
|
||||
|
||||
contractLabel += `${contract}`;
|
||||
let tooltip = contract;
|
||||
contractLabel += `${contract.className}`;
|
||||
let tooltip = contract.className;
|
||||
|
||||
if(this.engine.contractsManager.contracts[contract].instanceOf !== undefined &&
|
||||
this.engine.contractsManager.contracts[this.engine.contractsManager.contracts[contract].instanceOf] !== undefined){
|
||||
contractInheritance[contract] = this.engine.contractsManager.contracts[contract].instanceOf;
|
||||
contractLabel += ": " + this.engine.contractsManager.contracts[contract].instanceOf;
|
||||
tooltip += " instance of " + this.engine.contractsManager.contracts[contract].instanceOf;
|
||||
if (contract.instanceOf !== undefined && contracts[contract.instanceOf] !== undefined) {
|
||||
contractInheritance[contract.className] = contract.instanceOf;
|
||||
contractLabel += ": " + contract.instanceOf;
|
||||
tooltip += " instance of " + contract.instanceOf;
|
||||
} else {
|
||||
if(!(options.skipFunctions === true && options.skipEvents === true)) contractLabel += "|";
|
||||
if (!(options.skipFunctions === true && options.skipEvents === true)) contractLabel += "|";
|
||||
|
||||
for(let i = 0; i < this.engine.contractsManager.contracts[contract].abiDefinition.length; i++){
|
||||
let abiDef = this.engine.contractsManager.contracts[contract].abiDefinition[i];
|
||||
if(abiDef.type == 'event' && options.skipEvents) continue;
|
||||
if(['constructor', 'fallback'].indexOf(abiDef.type) > -1 && options.skipFunctions) continue;
|
||||
for (let i = 0; i < contract.abiDefinition.length; i++) {
|
||||
let abiDef = contract.abiDefinition[i];
|
||||
if (abiDef.type == 'event' && options.skipEvents) continue;
|
||||
if (['constructor', 'fallback'].indexOf(abiDef.type) > -1 && options.skipFunctions) continue;
|
||||
|
||||
switch(abiDef.type){
|
||||
case 'fallback':
|
||||
|
@ -66,41 +83,49 @@ class GraphGenerator {
|
|||
}
|
||||
}
|
||||
|
||||
let fHashes = this.engine.contractsManager.contracts[contract].functionHashes;
|
||||
if(fHashes != {} && fHashes != undefined && !options.skipFunctions){
|
||||
for(let method in this.engine.contractsManager.contracts[contract].functionHashes){
|
||||
let fHashes = contract.functionHashes;
|
||||
if (fHashes != {} && fHashes != undefined && !options.skipFunctions){
|
||||
for (let method in contract.functionHashes){
|
||||
contractLabel += method + '\\l';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let others = '';
|
||||
if(!this.engine.contractsManager.contracts[contract].deploy){
|
||||
if (!contract.deploy){
|
||||
others = 'fontcolor="#c3c3c3", color="#a0a0a0"';
|
||||
tooltip += " (not deployed)";
|
||||
}
|
||||
|
||||
contractString += `${id}[label = "{${contractLabel}}", tooltip="${tooltip}", fillcolor=gray95, ${others}]\n`;
|
||||
|
||||
}
|
||||
|
||||
for (let c in this.engine.contractsManager.contractDependencies){
|
||||
let contractDependencies = Array.from(new Set(this.engine.contractsManager.contractDependencies[c]));
|
||||
next();
|
||||
},
|
||||
function (next) {
|
||||
for (let c in contractsDependencies) {
|
||||
let contractDependencies = Array.from(new Set(contractsDependencies[c]));
|
||||
contractDependencies.forEach((d) => {
|
||||
if(idMapping[c] !== undefined && idMapping[d] !== undefined){
|
||||
if((options.skipUndeployed && this.engine.contractsManager.contracts[c].deploy && this.engine.contractsManager.contracts[d].deploy) || !options.skipUndeployed){
|
||||
if (idMapping[c] !== undefined && idMapping[d] !== undefined) {
|
||||
if ((options.skipUndeployed && contracts[c].deploy && contracts[d].deploy) || !options.skipUndeployed) {
|
||||
relationshipString += `${idMapping[d]}->${idMapping[c]}[constraint=true, arrowtail=diamond, tooltip="${c} uses ${d}"]\n`;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
next();
|
||||
},
|
||||
function (next) {
|
||||
for (let c in contractInheritance){
|
||||
if(options.skipUndeployed && !this.engine.contractsManager.contracts[contractInheritance[c]].deploy) continue;
|
||||
if(options.skipUndeployed && !contracts[contractInheritance[c]].deploy) continue;
|
||||
|
||||
relationshipString += `${idMapping[contractInheritance[c]]}->${idMapping[c]}[tooltip="${c} instance of ${contractInheritance[c]}"]\n`;
|
||||
}
|
||||
|
||||
console.log("-----");
|
||||
console.log(relationshipString);
|
||||
console.log("-----");
|
||||
next();
|
||||
},
|
||||
function (next) {
|
||||
let dot = `
|
||||
digraph Contracts {
|
||||
node[shape=record,style=filled]
|
||||
|
@ -109,15 +134,18 @@ class GraphGenerator {
|
|||
${relationshipString}
|
||||
}`;
|
||||
|
||||
console.log(dot);
|
||||
let svg = Viz(dot);
|
||||
|
||||
let filename = "diagram.svg";
|
||||
|
||||
fs.writeFileSync(filename, svg, (err) => {
|
||||
if (err) throw err;
|
||||
next();
|
||||
});
|
||||
}
|
||||
], function(_err, _result) {
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue