Merge pull request #379 from embark-framework/features/context-in-plugins

Support multiple contexts at once
This commit is contained in:
Iuri Matias 2018-04-25 16:11:30 -04:00 committed by GitHub
commit 0c57f37377
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 95 additions and 29 deletions

View File

@ -3,6 +3,13 @@
"contexts": { "contexts": {
"simulator": "simulator", "simulator": "simulator",
"blockchain": "blockchain", "blockchain": "blockchain",
"templateGeneration": "templateGeneration",
"run": "run",
"upload": "upload",
"build": "build",
"graph": "graph",
"test": "test",
"reset": "reset",
"any": "any" "any": "any"
}, },
"events": { "events": {

View File

@ -20,6 +20,7 @@ var Config = function(options) {
this.logger = options.logger; this.logger = options.logger;
this.events = options.events; this.events = options.events;
this.embarkConfig = {}; this.embarkConfig = {};
this.context = options.context || [constants.contexts.any];
}; };
Config.prototype.loadConfigFiles = function(options) { Config.prototype.loadConfigFiles = function(options) {
@ -36,7 +37,7 @@ Config.prototype.loadConfigFiles = function(options) {
this.embarkConfig = fs.readJSONSync(options.embarkConfig); this.embarkConfig = fs.readJSONSync(options.embarkConfig);
this.embarkConfig.plugins = this.embarkConfig.plugins || {}; this.embarkConfig.plugins = this.embarkConfig.plugins || {};
this.plugins = new Plugins({plugins: this.embarkConfig.plugins, logger: this.logger, interceptLogs: interceptLogs, events: this.events, config: this}); this.plugins = new Plugins({plugins: this.embarkConfig.plugins, logger: this.logger, interceptLogs: interceptLogs, events: this.events, config: this, context: this.context});
this.plugins.loadPlugins(); this.plugins.loadPlugins();
this.loadEmbarkConfigFile(); this.loadEmbarkConfigFile();

View File

@ -9,7 +9,6 @@ let ServicesMonitor = require('./services_monitor.js');
let Pipeline = require('../pipeline/pipeline.js'); let Pipeline = require('../pipeline/pipeline.js');
let Watch = require('../pipeline/watch.js'); let Watch = require('../pipeline/watch.js');
let LibraryManager = require('../versions/library_manager.js'); let LibraryManager = require('../versions/library_manager.js');
const constants = require('../constants');
class Engine { class Engine {
constructor(options) { constructor(options) {
@ -20,7 +19,7 @@ class Engine {
this.logFile = options.logFile; this.logFile = options.logFile;
this.logLevel = options.logLevel; this.logLevel = options.logLevel;
this.events = options.events; this.events = options.events;
this.context = constants.contexts.simulator; // Will change to blockchain once we can connect to the blockchain this.context = options.context;
} }
init(_options) { init(_options) {
@ -28,7 +27,7 @@ class Engine {
let options = _options || {}; let options = _options || {};
this.events = options.events || this.events || new Events(); this.events = options.events || this.events || new Events();
this.logger = options.logger || new Logger({logLevel: options.logLevel || this.logLevel || 'debug', events: this.events, logFile: this.logFile}); this.logger = options.logger || new Logger({logLevel: options.logLevel || this.logLevel || 'debug', events: this.events, logFile: this.logFile});
this.config = new Config({env: this.env, logger: this.logger, events: this.events}); this.config = new Config({env: this.env, logger: this.logger, events: this.events, context: this.context});
this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs}); this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs});
this.plugins = this.config.plugins; this.plugins = this.config.plugins;
@ -228,15 +227,6 @@ class Engine {
return cb({name: version, status: 'on'}); return cb({name: version, status: 'on'});
} }
let nodeName = version.split("/")[0]; let nodeName = version.split("/")[0];
const oldContext = self.context;
if (nodeName === 'Geth' || nodeName.toLowerCase().indexOf('test') < 0) {
self.context = constants.contexts.blockchain;
} else {
self.context = constants.contexts.simulator;
}
if (oldContext !== self.context) {
self.events.emit(constants.events.contextChange, self.context);
}
let versionNumber = version.split("/")[1].split("-")[0]; let versionNumber = version.split("/")[1].split("-")[0];
let name = nodeName + " " + versionNumber + " (Ethereum)"; let name = nodeName + " " + versionNumber + " (Ethereum)";

View File

@ -29,19 +29,37 @@ var Plugin = function(options) {
this.events = options.events; this.events = options.events;
this.config = options.config; this.config = options.config;
this.loaded = false; this.loaded = false;
this.context = options.pluginConfig.context || constants.contexts.any; this.currentContext = options.context;
this.acceptedContext = options.pluginConfig.context || [constants.contexts.any];
if (!Array.isArray(this.currentContext)) {
this.currentContext = [this.currentContext];
}
if (!Array.isArray(this.acceptedContext)) {
this.acceptedContext = [this.acceptedContext];
}
}; };
Plugin.prototype.loadPlugin = function(currentContext) { Plugin.prototype.isContextValid = function() {
if (this.context !== constants.contexts.any && this.context !== currentContext) { if (this.currentContext.includes(constants.contexts.any) || this.acceptedContext.includes(constants.contexts.any)) {
if (currentContext) { return true;
this.logger.warn(`Plugin ${this.name} can only be loaded in the context of the ${this.context}`);
} }
return this.events.on(constants.events.contextChange, this.loadPlugin.bind(this)); return this.acceptedContext.some(context => {
return this.currentContext.includes(context);
});
};
Plugin.prototype.hasContext = function(context) {
return this.currentContext.includes(context);
};
Plugin.prototype.loadPlugin = function() {
if (!this.isContextValid()) {
console.log(this.acceptedContext);
this.logger.warn(`Plugin ${this.name} can only be loaded in the context of "${this.acceptedContext.join(', ')}"`);
return false;
} }
this.loaded = true; this.loaded = true;
this.logger.info(`Loaded plugin ${this.name}`);
this.events.removeListener(constants.events.contextChange, this.loadPlugin.bind(this));
if (this.shouldInterceptLogs) { if (this.shouldInterceptLogs) {
this.interceptLogs(this.pluginModule); this.interceptLogs(this.pluginModule);
} }

View File

@ -9,6 +9,7 @@ var Plugins = function(options) {
this.logger = options.logger; this.logger = options.logger;
this.events = options.events; this.events = options.events;
this.config = options.config; this.config = options.config;
this.context = options.context;
}; };
Plugins.prototype.loadPlugins = function() { Plugins.prototype.loadPlugins = function() {
@ -33,7 +34,18 @@ Plugins.prototype.listPlugins = function() {
Plugins.prototype.createPlugin = function(pluginName, pluginConfig) { Plugins.prototype.createPlugin = function(pluginName, pluginConfig) {
let plugin = {}; let plugin = {};
let pluginPath = false; let pluginPath = false;
var pluginWrapper = new Plugin({name: pluginName, pluginModule: plugin, pluginConfig: pluginConfig, logger: this.logger, pluginPath: pluginPath, interceptLogs: this.interceptLogs, events: this.events, config: this.config, isInternal: true}); var pluginWrapper = new Plugin({
name: pluginName,
pluginModule: plugin,
pluginConfig: pluginConfig,
logger: this.logger,
pluginPath: pluginPath,
interceptLogs: this.interceptLogs,
events: this.events,
config: this.config,
isInternal: true,
context: this.context
});
this.plugins.push(pluginWrapper); this.plugins.push(pluginWrapper);
return pluginWrapper; return pluginWrapper;
}; };
@ -42,7 +54,18 @@ Plugins.prototype.loadInternalPlugin = function(pluginName, pluginConfig) {
var pluginPath = utils.joinPath('../modules/', pluginName, 'index.js'); var pluginPath = utils.joinPath('../modules/', pluginName, 'index.js');
var plugin = require(pluginPath); var plugin = require(pluginPath);
var pluginWrapper = new Plugin({name: pluginName, pluginModule: plugin, pluginConfig: pluginConfig, logger: this.logger, pluginPath: pluginPath, interceptLogs: this.interceptLogs, events: this.events, config: this.config, isInternal: true}); var pluginWrapper = new Plugin({
name: pluginName,
pluginModule: plugin,
pluginConfig: pluginConfig,
logger: this.logger,
pluginPath: pluginPath,
interceptLogs: this.interceptLogs,
events: this.events,
config: this.config,
isInternal: true,
context: this.context
});
pluginWrapper.loadInternalPlugin(); pluginWrapper.loadInternalPlugin();
this.plugins.push(pluginWrapper); this.plugins.push(pluginWrapper);
}; };
@ -51,7 +74,18 @@ Plugins.prototype.loadPlugin = function(pluginName, pluginConfig) {
var pluginPath = utils.joinPath(utils.pwd(), 'node_modules', pluginName); var pluginPath = utils.joinPath(utils.pwd(), 'node_modules', pluginName);
var plugin = require(pluginPath); var plugin = require(pluginPath);
var pluginWrapper = new Plugin({name: pluginName, pluginModule: plugin, pluginConfig: pluginConfig, logger: this.logger, pluginPath: pluginPath, interceptLogs: this.interceptLogs, events: this.events, config: this.config, isInternal: false}); var pluginWrapper = new Plugin({
name: pluginName,
pluginModule: plugin,
pluginConfig: pluginConfig,
logger: this.logger,
pluginPath: pluginPath,
interceptLogs: this.interceptLogs,
events: this.events,
config: this.config,
isInternal: false,
context: this.context
});
pluginWrapper.loadPlugin(); pluginWrapper.loadPlugin();
this.plugins.push(pluginWrapper); this.plugins.push(pluginWrapper);
}; };

View File

@ -1,4 +1,5 @@
let async = require('async'); let async = require('async');
const constants = require('./constants');
// require("./utils/debug_util.js")(__filename, async); // require("./utils/debug_util.js")(__filename, async);
require('colors'); require('colors');
@ -31,22 +32,25 @@ class Embark {
this.events = new Events(); this.events = new Events();
this.logger = new Logger({logLevel: 'debug', events: this.events}); this.logger = new Logger({logLevel: 'debug', events: this.events});
this.config = new Config({env: env, logger: this.logger, events: this.events}); this.config = new Config({env: env, logger: this.logger, events: this.events, context: this.context});
this.config.loadConfigFiles(options); this.config.loadConfigFiles(options);
this.plugins = this.config.plugins; this.plugins = this.config.plugins;
} }
blockchain(env, client) { blockchain(env, client) {
this.context = [constants.contexts.blockchain];
return require('./cmds/blockchain/blockchain.js')(this.config.blockchainConfig, client, env).run(); return require('./cmds/blockchain/blockchain.js')(this.config.blockchainConfig, client, env).run();
} }
simulator(options) { simulator(options) {
this.context = options.context || [constants.contexts.simulator, constants.contexts.blockchain];
let Simulator = require('./cmds/simulator.js'); let Simulator = require('./cmds/simulator.js');
let simulator = new Simulator({blockchainConfig: this.config.blockchainConfig}); let simulator = new Simulator({blockchainConfig: this.config.blockchainConfig});
simulator.run(options); simulator.run(options);
} }
generateTemplate(templateName, destinationFolder, name) { generateTemplate(templateName, destinationFolder, name) {
this.context = [constants.contexts.templateGeneration];
let TemplateGenerator = require('./cmds/template_generator.js'); let TemplateGenerator = require('./cmds/template_generator.js');
let templateGenerator = new TemplateGenerator(templateName); let templateGenerator = new TemplateGenerator(templateName);
templateGenerator.generate(destinationFolder, name); templateGenerator.generate(destinationFolder, name);
@ -54,6 +58,7 @@ class Embark {
run(options) { run(options) {
let self = this; let self = this;
self.context = options.context || [constants.contexts.run, constants.contexts.build];
let Dashboard = require('./dashboard/dashboard.js'); let Dashboard = require('./dashboard/dashboard.js');
let windowSize = require('window-size'); let windowSize = require('window-size');
@ -62,7 +67,8 @@ class Embark {
version: this.version, version: this.version,
embarkConfig: options.embarkConfig || 'embark.json', embarkConfig: options.embarkConfig || 'embark.json',
logFile: options.logFile, logFile: options.logFile,
logLevel: options.logLevel logLevel: options.logLevel,
context: self.context
}); });
engine.init(); engine.init();
@ -152,6 +158,7 @@ class Embark {
} }
build(options, continueProcessing) { build(options, continueProcessing) {
this.context = options.context || [constants.contexts.build];
let engine = new Engine({ let engine = new Engine({
env: options.env, env: options.env,
version: this.version, version: this.version,
@ -162,7 +169,8 @@ class Embark {
events: options.events, events: options.events,
logger: options.logger, logger: options.logger,
config: options.config, config: options.config,
plugins: options.plugins plugins: options.plugins,
context: this.context
}); });
engine.init(); engine.init();
@ -201,18 +209,22 @@ class Embark {
} }
initTests(options) { initTests(options) {
this.context = options.context || [constants.contexts.test];
let Test = require('./tests/test.js'); let Test = require('./tests/test.js');
options.context = this.context;
return new Test(options); return new Test(options);
} }
graph(options) { graph(options) {
this.context = options.context || [constants.contexts.graph];
options.onlyCompile = true; options.onlyCompile = true;
let engine = new Engine({ let engine = new Engine({
env: options.env, env: options.env,
version: this.version, version: this.version,
embarkConfig: options.embarkConfig || 'embark.json', embarkConfig: options.embarkConfig || 'embark.json',
logFile: options.logFile logFile: options.logFile,
context: this.context
}); });
engine.init(); engine.init();
@ -253,11 +265,13 @@ class Embark {
} }
reset() { reset() {
this.context = [constants.contexts.reset];
let resetCmd = require('./cmds/reset.js'); let resetCmd = require('./cmds/reset.js');
resetCmd(); resetCmd();
} }
upload(platform, options) { upload(platform, options) {
this.context = options.context || [constants.contexts.upload, constants.contexts.build];
// populate options that were instantiated with initConfig to pass around // populate options that were instantiated with initConfig to pass around
options.buildDir = 'dist/'; options.buildDir = 'dist/';
@ -318,6 +332,7 @@ class Embark {
} }
runTests(file) { runTests(file) {
this.context = [constants.contexts.test];
let RunTests = require('./tests/run_tests.js'); let RunTests = require('./tests/run_tests.js');
RunTests.run(file); RunTests.run(file);
} }
@ -327,6 +342,7 @@ class Embark {
// temporary until next refactor // temporary until next refactor
Embark.initTests = function(options) { Embark.initTests = function(options) {
let Test = require('./tests/test.js'); let Test = require('./tests/test.js');
options.context = [constants.contexts.test];
return new Test(options); return new Test(options);
}; };