mirror of https://github.com/embarklabs/embark.git
refactor: start moving contracts code to its own file + specs
This commit is contained in:
parent
e9c34168a2
commit
eac991971a
|
@ -13,7 +13,7 @@ var run = function(cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
program
|
program
|
||||||
.version('0.4.3')
|
.version('0.5.0')
|
||||||
|
|
||||||
program.command('new [name]').description('New application').action(function(name) {
|
program.command('new [name]').description('New application').action(function(name) {
|
||||||
if (name === undefined) {
|
if (name === undefined) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
var readYaml = require('read-yaml');
|
var readYaml = require('read-yaml');
|
||||||
|
|
||||||
BlockchainConfig = require('./blockchain.js');
|
BlockchainConfig = require('./blockchain.js');
|
||||||
|
ContractsConfig = require('./contracts.js');
|
||||||
|
|
||||||
Config = {
|
Config = {
|
||||||
Blockchain: BlockchainConfig
|
Blockchain: BlockchainConfig,
|
||||||
|
Contracts: ContractsConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Config
|
module.exports = Config
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
var readYaml = require('read-yaml');
|
||||||
|
var fs = require('fs');
|
||||||
|
var Blockchain = require('./blockchain.js');
|
||||||
|
|
||||||
|
ContractsConfig = function(files, blockchainConfig, web3) {
|
||||||
|
this.all_contracts = [];
|
||||||
|
this.contractDB = {};
|
||||||
|
this.contractFiles = files;
|
||||||
|
this.web3 = web3;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.web3.setProvider(new this.web3.providers.HttpProvider("http://" + blockchainConfig.rpcHost + ":" + blockchainConfig.rpcPort));
|
||||||
|
primaryAddress = this.web3.eth.coinbase;
|
||||||
|
this.web3.eth.defaultAccount = primaryAddress;
|
||||||
|
} catch (_error) {
|
||||||
|
e = _error;
|
||||||
|
throw new Error("can't connect to " + blockchainConfig.rpcHost + ":" + blockchainConfig.rpcPort + " check if an ethereum node is running");
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("address is : " + primaryAddress);
|
||||||
|
};
|
||||||
|
|
||||||
|
ContractsConfig.prototype.loadConfigFile = function(filename) {
|
||||||
|
try {
|
||||||
|
this.contractConfig = readYaml.sync(filename);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("error reading " + filename);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContractsConfig.prototype.loadConfig = function(config) {
|
||||||
|
this.contractConfig = config;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContractsConfig.prototype.config = function(env) {
|
||||||
|
return this.contractConfig[env];
|
||||||
|
}
|
||||||
|
|
||||||
|
ContractsConfig.prototype.compileContracts = function() {
|
||||||
|
var contractFile, source, j;
|
||||||
|
|
||||||
|
for (j = 0; j < this.contractFiles.length; j++) {
|
||||||
|
contractFile = this.contractFiles[j];
|
||||||
|
source = fs.readFileSync(contractFile).toString()
|
||||||
|
|
||||||
|
console.log("compiling " + contractFile);
|
||||||
|
compiled_contracts = this.web3.eth.compile.solidity(source);
|
||||||
|
for (className in compiled_contracts) {
|
||||||
|
var contract = compiled_contracts[className];
|
||||||
|
this.all_contracts.push(className);
|
||||||
|
this.contractDB[className] = contract;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ContractsConfig
|
||||||
|
|
|
@ -9,7 +9,8 @@ deployContracts = function(env, contractFiles, destFile) {
|
||||||
|
|
||||||
blockchainConfig = (new Config.Blockchain()).loadConfigFile('config/blockchain.yml').config(env);
|
blockchainConfig = (new Config.Blockchain()).loadConfigFile('config/blockchain.yml').config(env);
|
||||||
|
|
||||||
contractsConfig = readYaml.sync("config/contracts.yml")[env || "development"];
|
contractsManager = (new Config.Contracts(contractFiles, blockchainConfig)).loadConfigFile('config/contracts.yml');
|
||||||
|
contractsConfig = contractsManager.config(env);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
web3.setProvider(new web3.providers.HttpProvider("http://" + blockchainConfig.rpcHost + ":" + blockchainConfig.rpcPort));
|
web3.setProvider(new web3.providers.HttpProvider("http://" + blockchainConfig.rpcHost + ":" + blockchainConfig.rpcPort));
|
||||||
|
@ -48,22 +49,9 @@ deployContracts = function(env, contractFiles, destFile) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
all_contracts = [];
|
contractsManager.compileContracts();
|
||||||
|
all_contracts = contractsManager.all_contracts;
|
||||||
contractDB = {};
|
contractDB = contractsManager.contractDB;
|
||||||
|
|
||||||
for (j = 0, len1 = contractFiles.length; j < len1; j++) {
|
|
||||||
contractFile = contractFiles[j];
|
|
||||||
//source = grunt.file.read(contractFile);
|
|
||||||
source = fs.readFileSync(contractFile).toString()
|
|
||||||
console.log("deploying " + contractFile);
|
|
||||||
compiled_contracts = web3.eth.compile.solidity(source);
|
|
||||||
for (className in compiled_contracts) {
|
|
||||||
contract = compiled_contracts[className];
|
|
||||||
all_contracts.push(className);
|
|
||||||
contractDB[className] = contract;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
all_contracts.sort((function(_this) {
|
all_contracts.sort((function(_this) {
|
||||||
return function(a, b) {
|
return function(a, b) {
|
||||||
|
|
20
lib/test.js
20
lib/test.js
|
@ -18,8 +18,8 @@ TestContractWrapper = (function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
TestContractWrapper.prototype.initializeContract = function() {
|
TestContractWrapper.prototype.initializeContract = function() {
|
||||||
example_abi = JSON.stringify(contract.info.abiDefinition)
|
example_abi = JSON.stringify(this.contract.info.abiDefinition)
|
||||||
example_binary = contract.code.slice(2)
|
example_binary = this.contract.code.slice(2)
|
||||||
|
|
||||||
py_exec("example_abi = '" + example_abi + "'")
|
py_exec("example_abi = '" + example_abi + "'")
|
||||||
py_exec("example_abi")
|
py_exec("example_abi")
|
||||||
|
@ -67,19 +67,11 @@ request = function(className, args) {
|
||||||
|
|
||||||
//TODO: get the files from the config
|
//TODO: get the files from the config
|
||||||
contractFiles = grunt.file.expand("./app/contracts/**/*.sol")
|
contractFiles = grunt.file.expand("./app/contracts/**/*.sol")
|
||||||
contractDB = {}
|
blockchainConfig = (new Config.Blockchain()).loadConfigFile('config/blockchain.yml').config(env);
|
||||||
|
contractsConfig = new Config.Contracts(contractFiles, blockchainConfig);
|
||||||
|
|
||||||
var i;
|
contractsConfig.compileContracts();
|
||||||
for (i = 0, len = contractFiles.length; i < len; i++) {
|
contractDB = contractsConfig.contractDB;
|
||||||
var contractFile = contractFiles[i];
|
|
||||||
var source = fs.readFileSync(contractFile).toString()
|
|
||||||
|
|
||||||
compiled_contracts = web3.eth.compile.solidity(source)
|
|
||||||
for (className in compiled_contracts) {
|
|
||||||
var contract = compiled_contracts[className];
|
|
||||||
contractDB[className] = contract;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var contract = contractDB[className];
|
var contract = contractDB[className];
|
||||||
return TestContract(contract, className, args)
|
return TestContract(contract, className, args)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "embark-framework",
|
"name": "embark-framework",
|
||||||
"version": "0.4.3",
|
"version": "0.5.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
@ -41,6 +41,8 @@
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"grunt-mocha-test": "^0.12.7",
|
"grunt-mocha-test": "^0.12.7",
|
||||||
"mocha": "^2.2.5"
|
"mocha": "^2.2.5",
|
||||||
|
"mocha-sinon": "^1.1.4",
|
||||||
|
"sinon": "^1.15.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
var Config = require('../lib/config/config.js');
|
||||||
|
var assert = require('assert');
|
||||||
|
var sinon = require('sinon');
|
||||||
|
var web3 = require('web3');
|
||||||
|
require('mocha-sinon');
|
||||||
|
|
||||||
|
describe('embark.config.contracts', function() {
|
||||||
|
var blockchainConfig = (new Config.Blockchain()).loadConfigFile('test/support/blockchain.yml').config("development");
|
||||||
|
//sinon.stub(web3, "setProvider");
|
||||||
|
//sinon.stub(web3.eth.compile, "solidity", function() {
|
||||||
|
// return "compiled_code";
|
||||||
|
//});
|
||||||
|
|
||||||
|
describe('#loadConfigFile', function() {
|
||||||
|
it('should read and load yml file', function() {
|
||||||
|
var contractsConfig = new Config.Contracts([], blockchainConfig, web3);
|
||||||
|
contractsConfig.loadConfigFile('test/support/contracts.yml');
|
||||||
|
|
||||||
|
assert.equal(contractsConfig.contractConfig.hasOwnProperty('development'), true)
|
||||||
|
assert.equal(contractsConfig.contractConfig.hasOwnProperty('staging'), true)
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw exception reading invalid file', function() {
|
||||||
|
assert.throws(function() { contractsConfig.loadConfigFile('test/support/invalid.yml') }, Error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#loadConfig', function() {
|
||||||
|
it('should load config', function() {
|
||||||
|
var contractsConfig = new Config.Contracts([], blockchainConfig, web3);
|
||||||
|
var hsh = {
|
||||||
|
development: {},
|
||||||
|
staging: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
contractsConfig.loadConfig(hsh);
|
||||||
|
|
||||||
|
assert.equal(contractsConfig.contractConfig.hasOwnProperty('development'), true)
|
||||||
|
assert.equal(contractsConfig.contractConfig.hasOwnProperty('staging'), true)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#compileContracts', function() {
|
||||||
|
context("simple contracts", function() {
|
||||||
|
before(function() {
|
||||||
|
files = [
|
||||||
|
'test/support/contracts/simple_storage.sol',
|
||||||
|
'test/support/contracts/another_storage.sol'
|
||||||
|
]
|
||||||
|
contractsConfig = new Config.Contracts(files, blockchainConfig, web3);
|
||||||
|
contractsConfig.loadConfigFile('test/support/contracts.yml');
|
||||||
|
contractsConfig.compileContracts();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('add contracts to a list', function() {
|
||||||
|
assert.deepEqual(contractsConfig.all_contracts, [ "SimpleStorage", "AnotherStorage" ]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
development:
|
||||||
|
staging:
|
|
@ -0,0 +1,14 @@
|
||||||
|
contract AnotherStorage {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
function SimpleStorage(uint initialValue) {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
function get() constant returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
contract SimpleStorage {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
function SimpleStorage(uint initialValue) {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
function get() constant returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue