Skip to content
This repository has been archived by the owner on Jun 11, 2019. It is now read-only.

Commit

Permalink
Merge pull request #194 from ryepdx/feature/overrideBuildGlobal
Browse files Browse the repository at this point in the history
Feature/override build global
  • Loading branch information
nmushegian committed Mar 22, 2016
2 parents 17a39a2 + c379904 commit 8088455
Show file tree
Hide file tree
Showing 14 changed files with 135 additions and 33 deletions.
4 changes: 2 additions & 2 deletions cmd/docopt.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Usage:
dapple config
dapple init
dapple install [--save] [options] [<package> <url-or-version>]
dapple build [-r <RegExp>] [options] [--no-deploy-data]
dapple build [-r <RegExp>] [--global=<globalVar>] [options] [--no-deploy-data]
dapple test [-r <RegExp>] [options] [--skip-build]
dapple new test <class>
dapple run <script> [--force] [--no-simulation] [options]
Expand All @@ -15,5 +15,5 @@ Options:
-e ENVIRONMENT, --environment ENVIRONMENT [default: evm]
-c DAPPLERC, --config DAPPLERC
-s, --subpackages Include subpackages in output
--report Turn on the reporer
--report Turn on the reporter
--version Dapple Version
4 changes: 3 additions & 1 deletion cmd/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,11 @@ if (cli.install) {
// Run our build pipeline.
let jsBuildPipeline = req.pipelines
.JSBuildPipeline({
deploy_data: !cli['--no-deploy-data'],
deployData: !cli['--no-deploy-data'],
environment: env,
environments: environments,
globalVar: cli['--global'],
name: workspace.dappfile.name,
nameFilter: nameFilter,
subpackages: cli['--subpackages'] || cli['-s']
});
Expand Down
12 changes: 6 additions & 6 deletions constants/build_templates/js_module.template
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
'use strict';

// For geth
<% if (!globalVar) { %>// For geth
if (typeof dapple === 'undefined') {
var dapple = {};
}

if (typeof web3 === 'undefined' && typeof Web3 === 'undefined') {
<% } %>if (typeof web3 === 'undefined' && typeof Web3 === 'undefined') {
var Web3 = require('web3');
}

dapple['<%= name %>'] = (function builder () {
<%= globalVar ? 'var ' + globalVar : "dapple['" + name + "']" %> = (function builder () {
var environments = <%= envs %>;

function ContractWrapper (headers, _web3) {
Expand All @@ -22,7 +22,7 @@ dapple['<%= name %>'] = (function builder () {
}

ContractWrapper.prototype.deploy = function () {
<% if (!deploy_data) {
<% if (!deployData) {
%>throw new Error('Module was built without any deploy data.');<%
} else {
%>var args = new Array(arguments);
Expand All @@ -31,7 +31,7 @@ dapple['<%= name %>'] = (function builder () {
}%>
};

<% if (!deploy_data) {
<% if (!deployData) {
%>ContractWrapper.prototype.new = function () {
throw new Error('Module was built without any deploy data.');
};
Expand Down Expand Up @@ -84,5 +84,5 @@ dapple['<%= name %>'] = (function builder () {
})();

if (typeof module !== 'undefined' && module.exports) {
module.exports = dapple['<%= name %>'];
module.exports = <%= globalVar || "dapple['" + name + "']" %>;
}
5 changes: 3 additions & 2 deletions lib/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ module.exports = class Builder {
var template = _.template(constants.JS_HEADER_TEMPLATE());
var headers = {};

if (!opts.deploy_data) {
if (!opts.deployData) {
omit.push('bytecode');
}

Expand Down Expand Up @@ -42,7 +42,8 @@ module.exports = class Builder {
.replace(/\n/g, '\n ')
.replace(/"/g, '\''),
name: opts.name,
deploy_data: opts.deploy_data
globalVar: opts.globalVar,
deployData: opts.deployData
});
}

Expand Down
12 changes: 8 additions & 4 deletions lib/pipelines.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ var _ = require('lodash');
var Combine = require('stream-combiner');
var filter = require('gulp-filter');
var loggers = require('../lib/loggers.js');
var path = require('path');
var streams = require('../lib/streams');
var Workspace = require('../lib/workspace.js');

Expand All @@ -23,9 +22,9 @@ var _fillOptionDefaults = function (opts) {
if (!opts) opts = {};

var mapAwareLogger = new loggers.MapAwareLogger();

var defaults = {
name: path.basename(process.cwd()),
deployData: true,
globalVar: false,
errorHandler: mapAwareLogger.getErrorHandler(),
logger: new loggers.Logger(),
mapAwareLogger: mapAwareLogger,
Expand All @@ -34,7 +33,8 @@ var _fillOptionDefaults = function (opts) {
web3: 'internal'
};

return _.assign(defaults, opts);
var _opts = _.assign(defaults, opts);
return _opts;
};

// This pipeline gathers together all the raw source files that go into a
Expand All @@ -61,6 +61,10 @@ var SourcePipeline = function (opts) {
var BuildPipeline = function (opts) {
// Defaults
opts = _fillOptionDefaults(opts);
if (!opts.name) {
var workspace = Workspace.atPackageRoot(opts.packageRoot);
opts.name = workspace.dappfile.name;
}

var solidityFilter = filter(['*.sol', '**/*.sol'], {restore: true});
var buildFilter = new streams.PackageBuildFilter();
Expand Down
8 changes: 6 additions & 2 deletions lib/streams/js_postprocess.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,12 @@ module.exports = function (opts) {
}

var _opts = {
env: env, envs: opts.environments, headers: headers, name: opts.name,
deploy_data: opts.deploy_data
deployData: opts.deployData,
env: env,
envs: opts.environments,
globalVar: opts.globalVar,
headers: headers,
name: opts.name
};

this.push(new File({
Expand Down
4 changes: 4 additions & 0 deletions lib/workspace.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ module.exports = class Workspace {
return this._dappfile || {};
}

getName (filePath) {
return this.getDappfile(filePath).name;
}

getDappfile (filePath) {
var dappfile;
if (filePath) {
Expand Down
74 changes: 74 additions & 0 deletions test/_fixtures/golden/js_module.my_global.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
'use strict';

if (typeof web3 === 'undefined' && typeof Web3 === 'undefined') {
var Web3 = require('web3');
}

var my_global = (function builder () {
var environments = {};

function ContractWrapper (headers, _web3) {
if (!_web3) {
throw new Error('Must supply a Web3 connection!');
}

this.headers = headers;
this._class = _web3.eth.contract(headers.interface);
}

ContractWrapper.prototype.deploy = function () {
var args = new Array(arguments);
args[args.length - 1].data = this.headers.bytecode;
return this._class.new.apply(this._class, args);
};

var passthroughs = ['at', 'new'];
for (var i = 0; i < passthroughs.length; i += 1) {
ContractWrapper.prototype[passthroughs[i]] = (function (passthrough) {
return function () {
return this._class[passthrough].apply(this._class, arguments);
};
})(passthroughs[i]);
}

function constructor (_web3, env) {
if (!env) {
env = {};
}
while (typeof env !== 'object') {
env = environments[env];
}

if (typeof _web3 === 'undefined') {
if (!env.rpcURL) {
throw new Error('Need either a Web3 instance or an RPC URL!');
}
_web3 = new Web3(new Web3.providers.HttpProvider(env.rpcURL));
}

this.headers = {
'contracts': {},
'version': {}
};

this.classes = {};
for (var key in this.headers) {
this.classes[key] = new ContractWrapper(this.headers[key], _web3);
}

this.objects = {};
for (var i in env.objects) {
var obj = env.objects[i];
this.objects[i] = this.classes[obj['class']].at(obj.address);
}
}

return {
class: constructor,
environments: environments
};
})();

if (typeof module !== 'undefined' && module.exports) {
module.exports = my_global;
}
4 changes: 0 additions & 4 deletions test/_fixtures/golden_lite/golden_init/dappfile

This file was deleted.

1 change: 0 additions & 1 deletion test/_fixtures/golden_lite/golden_solc_classes_out.json

This file was deleted.

1 change: 0 additions & 1 deletion test/_fixtures/golden_lite/solc_out.json

This file was deleted.

24 changes: 19 additions & 5 deletions test/build_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,22 +41,36 @@ describe('class Builder', function () {
var classes = testenv.golden.SOLC_OUT();
var headers = Builder.extractClassHeaders(classes);
var compiled = Builder.compileJsModule({
name: 'golden', headers: headers, deploy_data: true
name: 'golden', headers: headers, deployData: true,
packageRoot: testenv.golden.ROOT
});
// Uncomment to make new golden record
// fs.writeFileSync(testenv.golden.JS_OUT_PATH(), compiled);
assert.deepEqual(testenv.golden.JS_OUT(), compiled);
assert.deepEqual(compiled, testenv.golden.JS_OUT());
done();
});
it('writeJsHeader can also leave out the bytecode', function (done) {
var classes = testenv.golden.SOLC_OUT();
var headers = Builder.extractClassHeaders(classes);
var compiled = Builder.compileJsModule({
name: 'golden', headers: headers, deploy_data: false
name: 'golden', headers: headers, deployData: false,
packageRoot: testenv.golden.ROOT
});
// Uncomment to make new golden record
// fs.writeFileSync(testenv.golden.JS_LITE_OUT_PATH(), compiled);
assert.deepEqual(testenv.golden.JS_LITE_OUT(), compiled);
// fs.writeFileSync(testenv.golden.NO_DEPLOY_JS_OUT_PATH(), compiled);
assert.deepEqual(compiled, testenv.golden.NO_DEPLOY_JS_OUT());
done();
});
it('writeJsHeader also lets the user override the dapple global', function (done) {
var classes = testenv.golden.SOLC_OUT();
var headers = Builder.extractClassHeaders(classes);
var compiled = Builder.compileJsModule({
name: 'golden', deployData: true, globalVar: 'my_global',
headers: headers, packageRoot: testenv.golden.ROOT
});
// Uncomment to make new golden record
// fs.writeFileSync(testenv.golden.MY_GLOBAL_JS_OUT_PATH(), compiled);
assert.deepEqual(compiled, testenv.golden.MY_GLOBAL_JS_OUT());
done();
});
it('produces an importable JS file', function () {
Expand Down
15 changes: 10 additions & 5 deletions test/testenv.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,23 @@ module.exports = {
SOLC_OUT: function () {
return fs.readJsonSync(this.SOLC_OUT_PATH());
},
JS_LITE_OUT_PATH: function () {
return path.join(__dirname, '_fixtures', 'golden_lite', 'js_module.js');
NO_DEPLOY_JS_OUT_PATH: function () {
return path.join(__dirname, '_fixtures', 'golden', 'js_module.no_deploy.js');
},
JS_LITE_OUT: function () {
return fs.readFileSync(this.JS_LITE_OUT_PATH(), 'utf8');
NO_DEPLOY_JS_OUT: function () {
return fs.readFileSync(this.NO_DEPLOY_JS_OUT_PATH(), 'utf8');
},
MY_GLOBAL_JS_OUT_PATH: function () {
return path.join(__dirname, '_fixtures', 'golden', 'js_module.my_global.js');
},
MY_GLOBAL_JS_OUT: function () {
return fs.readFileSync(this.MY_GLOBAL_JS_OUT_PATH(), 'utf8');
},
INIT_EMPTY_DIR: path.join(
__dirname, '_fixtures', 'golden', 'golden_init'),
FILTERED_SOLC_OUT_PATH: path.join(
__dirname, '_fixtures', 'golden', 'golden_solc_classes_out')
},

dsl_package_dir: path.join(
__dirname, '_fixtures', 'testenv', 'deploy_package'),

Expand Down

0 comments on commit 8088455

Please sign in to comment.