add getUrl function for external contracts + tests
This commit is contained in:
parent
0948b04366
commit
cf14b3784f
|
@ -1,8 +1,9 @@
|
||||||
var fs = require('./fs.js');
|
const fs = require('./fs.js');
|
||||||
var File = require('./file.js');
|
const File = require('./file.js');
|
||||||
var Plugins = require('./plugins.js');
|
const Plugins = require('./plugins.js');
|
||||||
var utils = require('../utils/utils.js');
|
const utils = require('../utils/utils.js');
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
|
const request = require('request');
|
||||||
|
|
||||||
var Config = function(options) {
|
var Config = function(options) {
|
||||||
this.env = options.env;
|
this.env = options.env;
|
||||||
|
@ -142,6 +143,48 @@ Config.prototype.loadContractsConfigFile = function() {
|
||||||
this.contractsConfig = this._mergeConfig(configFilePath, configObject, this.env);
|
this.contractsConfig = this._mergeConfig(configFilePath, configObject, this.env);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Config.prototype.getExternalContractUrl = function (contract) {
|
||||||
|
let url;
|
||||||
|
const RAW_URL = 'https://raw.githubusercontent.com/';
|
||||||
|
const MALFORMED_ERROR = 'Malformed Github URL for ';
|
||||||
|
if (contract.file.startsWith('https://github')) {
|
||||||
|
const match = contract.file.match(/https:\/\/github\.[a-z]+\/(.*)/);
|
||||||
|
if (!match) {
|
||||||
|
this.logger.error(MALFORMED_ERROR + contract.file);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
url = `${RAW_URL}${match[1].replace('blob/', '')}`;
|
||||||
|
} else if (contract.file.startsWith('git')) {
|
||||||
|
// Match values
|
||||||
|
// [0] entire input
|
||||||
|
// [1] git://
|
||||||
|
// [2] user
|
||||||
|
// [3] repository
|
||||||
|
// [4] path
|
||||||
|
// [5] branch
|
||||||
|
const match = contract.file.match(
|
||||||
|
/(git:\/\/)?github\.[a-z]+\/([a-zA-Z0-9_\-.]+)\/([a-zA-Z0-9_\-7]+)\/([a-zA-Z0-9_\-\/.]+)#?([a-zA-Z0-1_\-.]*)?/
|
||||||
|
);
|
||||||
|
if (!match) {
|
||||||
|
this.logger.error(MALFORMED_ERROR + contract.file);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
let branch = match[5];
|
||||||
|
if (!branch) {
|
||||||
|
branch = 'master';
|
||||||
|
}
|
||||||
|
url = `${RAW_URL}${match[2]}/${match[3]}/${branch}/${match[4]}`;
|
||||||
|
} else {
|
||||||
|
url = contract.file;
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
};
|
||||||
|
|
||||||
|
Config.prototype.loadContractOnTheWeb = function (contract) {
|
||||||
|
const url = this.getExternalContractUrl(contract);
|
||||||
|
request(url).pipe(fs.createWriteStream('doodle.png'));
|
||||||
|
};
|
||||||
|
|
||||||
Config.prototype.loadExternalContractsFiles = function() {
|
Config.prototype.loadExternalContractsFiles = function() {
|
||||||
let contracts = this.contractsConfig.contracts;
|
let contracts = this.contractsConfig.contracts;
|
||||||
for (let contractName in contracts) {
|
for (let contractName in contracts) {
|
||||||
|
@ -149,7 +192,9 @@ Config.prototype.loadExternalContractsFiles = function() {
|
||||||
if (!contract.file) {
|
if (!contract.file) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (fs.existsSync(contract.file)) {
|
if (contract.file.startsWith('http') || contract.file.startsWith('git')) {
|
||||||
|
this.loadContractOnTheWeb(contract);
|
||||||
|
} else if (fs.existsSync(contract.file)) {
|
||||||
this.contractsFiles.push(new File({filename: contract.file, type: "dapp_file", basedir: '', path: contract.file}));
|
this.contractsFiles.push(new File({filename: contract.file, type: "dapp_file", basedir: '', path: contract.file}));
|
||||||
} else if (fs.existsSync(path.join('./node_modules/', contract.file))) {
|
} else if (fs.existsSync(path.join('./node_modules/', contract.file))) {
|
||||||
this.contractsFiles.push(new File({filename: path.join('./node_modules/', contract.file), type: "dapp_file", basedir: '', path: path.join('./node_modules/', contract.file)}));
|
this.contractsFiles.push(new File({filename: path.join('./node_modules/', contract.file), type: "dapp_file", basedir: '', path: path.join('./node_modules/', contract.file)}));
|
||||||
|
|
|
@ -24,11 +24,11 @@
|
||||||
"async": "^2.0.1",
|
"async": "^2.0.1",
|
||||||
"babel-core": "^6.26.0",
|
"babel-core": "^6.26.0",
|
||||||
"babel-loader": "^7.1.2",
|
"babel-loader": "^7.1.2",
|
||||||
|
"babel-plugin-webpack-aliases": "^1.1.3",
|
||||||
"babel-preset-es2015": "^6.24.1",
|
"babel-preset-es2015": "^6.24.1",
|
||||||
"babel-preset-es2016": "^6.24.1",
|
"babel-preset-es2016": "^6.24.1",
|
||||||
"babel-preset-es2017": "6.24.1",
|
"babel-preset-es2017": "6.24.1",
|
||||||
"babel-preset-react": "^6.24.1",
|
"babel-preset-react": "^6.24.1",
|
||||||
"babel-plugin-webpack-aliases": "^1.1.3",
|
|
||||||
"blessed": "^0.1.81",
|
"blessed": "^0.1.81",
|
||||||
"chokidar": "^1.6.0",
|
"chokidar": "^1.6.0",
|
||||||
"colors": "^1.1.2",
|
"colors": "^1.1.2",
|
||||||
|
@ -49,6 +49,7 @@
|
||||||
"parse-json": "^4.0.0",
|
"parse-json": "^4.0.0",
|
||||||
"promptly": "^2.1.0",
|
"promptly": "^2.1.0",
|
||||||
"propose": "0.0.5",
|
"propose": "0.0.5",
|
||||||
|
"request": "^2.85.0",
|
||||||
"serve-static": "^1.11.1",
|
"serve-static": "^1.11.1",
|
||||||
"shelljs": "^0.5.0",
|
"shelljs": "^0.5.0",
|
||||||
"solc": "0.4.17",
|
"solc": "0.4.17",
|
||||||
|
|
125
test/config.js
125
test/config.js
|
@ -1,17 +1,19 @@
|
||||||
/*globals describe, it*/
|
/*globals describe, it*/
|
||||||
let Config = require('../lib/core/config.js');
|
const Config = require('../lib/core/config.js');
|
||||||
let Plugins = require('../lib/core/plugins.js');
|
const Plugins = require('../lib/core/plugins.js');
|
||||||
let assert = require('assert');
|
const assert = require('assert');
|
||||||
|
const TestLogger = require('../lib/tests/test_logger.js');
|
||||||
|
|
||||||
describe('embark.Config', function() {
|
describe('embark.Config', function () {
|
||||||
let config = new Config({
|
let config = new Config({
|
||||||
env: 'myenv',
|
env: 'myenv',
|
||||||
configDir: './test/test1/config/'
|
configDir: './test/test1/config/'
|
||||||
});
|
});
|
||||||
config.plugins = new Plugins({plugins: {}});
|
config.plugins = new Plugins({plugins: {}});
|
||||||
|
config.logger = new TestLogger({});
|
||||||
|
|
||||||
describe('#loadBlockchainConfigFile', function() {
|
describe('#loadBlockchainConfigFile', function () {
|
||||||
it('should load blockchain config correctly', function() {
|
it('should load blockchain config correctly', function () {
|
||||||
config.loadBlockchainConfigFile();
|
config.loadBlockchainConfigFile();
|
||||||
let expectedConfig = {
|
let expectedConfig = {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
@ -32,30 +34,97 @@ describe('embark.Config', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#loadContractsConfigFile', function() {
|
describe('#loadContractsConfigFile', function () {
|
||||||
it('should load contract config correctly', function() {
|
it('should load contract config correctly', function () {
|
||||||
config.loadContractsConfigFile();
|
config.loadContractsConfigFile();
|
||||||
let expectedConfig = {
|
let expectedConfig = {
|
||||||
versions: { 'web3.js': '1.0.0-beta', solc: '0.4.17' },
|
versions: {'web3.js': '1.0.0-beta', solc: '0.4.17'},
|
||||||
deployment: { host: 'localhost', port: 8545, type: 'rpc' },
|
deployment: {host: 'localhost', port: 8545, type: 'rpc'},
|
||||||
dappConnection: [ '$WEB3', 'localhost:8545' ],
|
dappConnection: ['$WEB3', 'localhost:8545'],
|
||||||
"gas": "auto",
|
"gas": "auto",
|
||||||
"contracts": {
|
"contracts": {
|
||||||
"SimpleStorage": {
|
"SimpleStorage": {
|
||||||
"args": [
|
"args": [100],
|
||||||
100
|
"gas": 123456
|
||||||
],
|
},
|
||||||
"gas": 123456
|
"Token": {
|
||||||
},
|
"args": [200]
|
||||||
"Token": {
|
|
||||||
"args": [
|
|
||||||
200
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
assert.deepEqual(config.contractsConfig, expectedConfig);
|
assert.deepEqual(config.contractsConfig, expectedConfig);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#getExternalContractUrl', function () {
|
||||||
|
it('should get the right url for a https://github file', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'https://github.com/embark-framework/embark/blob/master/test_app/app/contracts/simple_storage.sol'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url,
|
||||||
|
'https://raw.githubusercontent.com/embark-framework/embark/master/test_app/app/contracts/simple_storage.sol');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail for a malformed https://github file', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'https://github/embark-framework/embark/blob/master/test_app/app/contracts/simple_storage.sol'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url, '');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get the right url for a git:// file with no branch #', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'git://github.com/status-im/contracts/contracts/identity/ERC725.sol'}
|
||||||
|
);
|
||||||
|
console.log(url);
|
||||||
|
assert.strictEqual(url,
|
||||||
|
'https://raw.githubusercontent.com/status-im/contracts/master/contracts/identity/ERC725.sol');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get the right url for a git:// file with a branch #', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'git://github.com/status-im/contracts/contracts/identity/ERC725.sol#myBranch'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url,
|
||||||
|
'https://raw.githubusercontent.com/status-im/contracts/myBranch/contracts/identity/ERC725.sol');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail when the git:// file is malformed', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'git://github.com/identity/ERC725.sol#myBranch'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url, '');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get the right url with a github.com file without branch #', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'github.com/status-im/contracts/contracts/identity/ERC725.sol'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url,
|
||||||
|
'https://raw.githubusercontent.com/status-im/contracts/master/contracts/identity/ERC725.sol');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get the right url with a github.com file with branch #', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'github.com/status-im/contracts/contracts/identity/ERC725.sol#theBranch'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url,
|
||||||
|
'https://raw.githubusercontent.com/status-im/contracts/theBranch/contracts/identity/ERC725.sol');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail with a malformed github.com url', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'github/status-im/contracts/contracts/identity/ERC725.sol#theBranch'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url, '');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should succeed with a generic http url', function () {
|
||||||
|
const url = config.getExternalContractUrl(
|
||||||
|
{file: 'http://myurl.com/myFile.sol'}
|
||||||
|
);
|
||||||
|
assert.strictEqual(url, 'http://myurl.com/myFile.sol');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue