Commit ce693568 by Tomas Dvorak

plugin infrastructure

parent eef2a54e
......@@ -13,13 +13,16 @@
"BinData": false,
"DBQuery": false,
"printjson": false,
"load": false,
"module": false,
"query": true,
"limit": true,
"maxDepth": true,
"sort": true,
"outputFormat": true,
"persistResults": true
"persistResults": true,
"plugins": true
},
"latedef": true,
"singleGroups": true,
......
......@@ -32,6 +32,8 @@ public class Variety {
public static final String PARAM_LIMIT = "limit";
public static final String PARAM_OUTPUT_FORMAT = "outputFormat";
public static final String PARAM_PERSIST_RESULTS = "persistResults";
public static final String PARAM_PLUGINS = "plugins";
private final String inputDatabase;
private final String inputCollection;
......@@ -46,6 +48,7 @@ public class Variety {
private String outputFormat;
private boolean quiet;
private boolean persistResults;
private String[] plugins;
/**
* Create variety wrapper with defined connection do analysed database and collection
......@@ -141,6 +144,11 @@ public class Variety {
return this;
}
public Variety withPlugins(String... plugins) {
this.plugins = plugins;
return this;
}
/**
* Executes mongo shell with configured variety options and variety.js script in path.
* @return Stdout of variety.js
......@@ -192,6 +200,11 @@ public class Variety {
if(persistResults) {
args.add(PARAM_PERSIST_RESULTS + " = " + persistResults);
}
if(plugins != null && plugins.length > 0) {
args.add(PARAM_PLUGINS + " = \"" + String.join(",", plugins) + "\"");
}
return args.toString();
}
......
package com.github.variety.test;
import com.github.variety.Variety;
import com.github.variety.validator.ResultsValidator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.net.URL;
public class PluginsTest {
private Variety variety;
public static final String EXPECTED_OUTPUT =
"key|types|occurrences|percents\n" +
"_id|ObjectId|5|100\n" +
"name|String|5|100\n" +
"bio|String|3|60\n" +
"birthday|String|2|40\n" +
"pets|Array,String|2|40\n" +
"someBinData|BinData-old|1|20\n" +
"someWeirdLegacyKey|String|1|20";
@Before
public void setUp() throws Exception {
this.variety = new Variety("test", "users");
variety.getSourceCollection().insert(SampleData.getDocuments());
}
@After
public void tearDown() throws Exception {
variety.getVarietyResultsDatabase().dropDatabase();
variety.getSourceCollection().drop();
}
/**
* Validate correct results read from DB
*/
@Test
public void verifyFormatResults() throws Exception {
final String path = getPluginPath("/csvplugin.js");
final ResultsValidator analysis = variety.withQuiet(true).withPlugins(path).runDatabaseAnalysis();
Assert.assertEquals(EXPECTED_OUTPUT, analysis.getStdOut());
}
@Test
public void verifyPluginParamParsing() throws Exception {
final String path = getPluginPath("/csvplugin.js");
final ResultsValidator analysis = variety.withPlugins(path + "|delimiter=;").runDatabaseAnalysis();
Assert.assertTrue(analysis.getStdOut().contains("Using plugins of " + path));
}
private String getPluginPath(final String name) {
final URL resource = this.getClass().getResource(name);
return resource.getFile();
}
}
var getCsv = function(varietyResults) {
var delimiter = this.delimiter || '|';
var headers = ['key', 'types', 'occurrences', 'percents'];
var table = [headers.join(delimiter)];
var rows = varietyResults.map(function(key) {
return [key._id.key, key.value.types, key.totalOccurrences, key.percentContaining].join(delimiter);
}, this);
return table.concat(rows).join('\n');
};
var setConfig = function(pluginConfig) {
this.delimiter = pluginConfig.delimiter;
};
module.exports = {
init: setConfig,
formatResults: getCsv
};
......@@ -101,6 +101,39 @@ log('Using persistResults of ' + $persistResults);
log('Using collection of ' + collection);
var $plugins = [];
if(typeof plugins !== 'undefined') {
var parsePath = function(val) { return val.slice(-3) !== '.js' ? val + '.js' : val;};
var parseConfig = function(val) {
var config = {};
val.split('&').reduce(function(acc, val) {
var parts = val.split('=');
acc[parts[0]] = parts[1];
return acc;
}, config);
return config;
};
$plugins = plugins.split(',')
.map(function(path){return path.trim();})
.map(function(definition){
var path = parsePath(definition.split('|')[0]);
var config = parseConfig(definition.split('|')[1] || '');
this.module = this.module || {};
load(path);
var plugin = this.module.exports;
plugin.path = path;
if(typeof plugin.init === 'function') {
plugin.init(config);
}
return plugin;
}, this);
log('Using plugins of ' + $plugins.map(function(plugin){return plugin.path;}));
}
var varietyTypeOf = function(thing) {
if (typeof thing === 'undefined') { throw 'varietyTypeOf() requires an argument'; }
......@@ -270,7 +303,13 @@ if($persistResults) {
resultsDB[resultsCollectionName].insert(varietyResults);
}
if($outputFormat === 'json') {
var formatResultPlugins = $plugins.filter(function(plugin){return typeof plugin.formatResults === 'function';});
if (formatResultPlugins.length > 0) {
formatResultPlugins.forEach(function(plugin){
print(plugin.formatResults(varietyResults));
});
} else if($outputFormat === 'json') {
printjson(varietyResults); // valid formatted json output, compressed variant is printjsononeline()
} else { // output nice ascii table with results
var table = [['key', 'types', 'occurrences', 'percents'], ['', '', '', '']]; // header + delimiter rows
......@@ -302,4 +341,4 @@ if($outputFormat === 'json') {
print(border + '\n' + output + border);
}
}()); // end strict mode
}.bind(this)()); // end strict mode
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment