Show debug output for translators and allow running all translators or only individual translators
This commit is contained in:
parent
983f5023bc
commit
581a8df4b9
3 changed files with 153 additions and 15 deletions
|
@ -46,6 +46,33 @@ td, th {
|
|||
background-color: #ececec;
|
||||
}
|
||||
|
||||
.status-pending {
|
||||
.status-pending, .status-running {
|
||||
background-color: #9FF;
|
||||
}
|
||||
|
||||
tr.output-displayed > td {
|
||||
background-color: #b4d5ff !important;
|
||||
}
|
||||
|
||||
#translator-box {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 25%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 5px;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
#output-box {
|
||||
position: absolute;
|
||||
top: 75%;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 5px;
|
||||
white-space: pre;
|
||||
overflow: scroll;
|
||||
font-family: Monaco, Courier, monospace;
|
||||
font-size: 10px;
|
||||
}
|
|
@ -23,11 +23,43 @@
|
|||
***** END LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
const NUM_CONCURRENT_TESTS = 6;
|
||||
const NUM_CONCURRENT_TESTS = 1;
|
||||
const TRANSLATOR_TYPES = ["Web", "Import", "Export", "Search"];
|
||||
const TABLE_COLUMNS = ["Translator", "Supported", "Status", "Pending", "Succeeded", "Failed", "Unknown"];
|
||||
var translatorTables = {};
|
||||
var translatorTestViewsToRun = {};
|
||||
var translatorBox;
|
||||
var outputBox;
|
||||
var allOutputView;
|
||||
var currentOutputView;
|
||||
|
||||
/**
|
||||
* Handles adding debug output to the output box
|
||||
* @param {HTMLElement} el An element to add class="selected" to when this outputView is displayed
|
||||
*/
|
||||
var OutputView = function(el) {
|
||||
this._output = [];
|
||||
this._el = el;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether this output is currently displayed in the output box
|
||||
* @param {Boolean} isDisplayed
|
||||
*/
|
||||
OutputView.prototype.setDisplayed = function(isDisplayed) {
|
||||
this.isDisplayed = isDisplayed;
|
||||
if(this.isDisplayed) outputBox.textContent = this._output.join("\n\n");
|
||||
if(this._el) this._el.className = (isDisplayed ? "output-displayed" : "output-hidden");
|
||||
currentOutputView = this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds output to the output view
|
||||
*/
|
||||
OutputView.prototype.addOutput = function(msg, level) {
|
||||
this._output.push(msg);
|
||||
if(this.isDisplayed) outputBox.textContent = this._output.join("\n\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Encapsulates a set of tests for a specific translator and type
|
||||
|
@ -74,20 +106,57 @@ var TranslatorTestView = function(translator, type) {
|
|||
// append to table
|
||||
translatorTables[type].appendChild(row);
|
||||
|
||||
// create output view and debug function
|
||||
var outputView = new OutputView(row);
|
||||
var debug = function(obj, msg, level) {
|
||||
outputView.addOutput(msg, level);
|
||||
allOutputView.addOutput(msg, level);
|
||||
}
|
||||
|
||||
// put click handler on row to allow display of debug output
|
||||
row.addEventListener("click", function(e) {
|
||||
// don't run deselect click event handler
|
||||
e.stopPropagation();
|
||||
|
||||
currentOutputView.setDisplayed(false);
|
||||
outputView.setDisplayed(true);
|
||||
}, false);
|
||||
|
||||
// create translator tester and update status based on what it knows
|
||||
this._translatorTester = new Zotero_TranslatorTester(translator, type);
|
||||
this._translatorTester = new Zotero_TranslatorTester(translator, type, debug);
|
||||
this.updateStatus(this._translatorTester);
|
||||
this.hasTests = !!this._translatorTester.tests.length;
|
||||
this.isRunning = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the displayed status of a translator
|
||||
*/
|
||||
TranslatorTestView.prototype.updateStatus = function(obj) {
|
||||
TranslatorTestView.prototype.updateStatus = function(obj, status) {
|
||||
while(this._status.hasChildNodes()) {
|
||||
this._status.removeChild(this._status.firstChild);
|
||||
}
|
||||
|
||||
if(obj.tests.length) {
|
||||
if(obj.pending.length) {
|
||||
this._status.className = "status-pending";
|
||||
this._status.textContent = "Pending";
|
||||
if(this.isRunning) {
|
||||
this._status.className = "status-running";
|
||||
this._status.textContent = "Running";
|
||||
} else if(status && status === "pending") {
|
||||
this._status.className = "status-pending";
|
||||
this._status.textContent = "Pending";
|
||||
} else {
|
||||
// show link to start
|
||||
var me = this;
|
||||
var a = document.createElement("a");
|
||||
a.href = "#";
|
||||
a.addEventListener("click", function(e) {
|
||||
e.preventDefault();
|
||||
me.runTests();
|
||||
}, false);
|
||||
a.textContent = "Run";
|
||||
this._status.appendChild(a);
|
||||
}
|
||||
} else if(obj.failed.length) {
|
||||
this._status.className = "status-failed";
|
||||
this._status.textContent = "Failed";
|
||||
|
@ -113,10 +182,17 @@ TranslatorTestView.prototype.updateStatus = function(obj) {
|
|||
* Runs test for this translator
|
||||
*/
|
||||
TranslatorTestView.prototype.runTests = function(doneCallback) {
|
||||
if(this.isRunning) return;
|
||||
this.isRunning = true;
|
||||
|
||||
// show as running
|
||||
this.updateStatus(this._translatorTester);
|
||||
|
||||
// set up callback
|
||||
var me = this;
|
||||
var newCallback = function(obj, test, status, message) {
|
||||
me.updateStatus(obj);
|
||||
if(obj.pending.length === 0) {
|
||||
if(obj.pending.length === 0 && doneCallback) {
|
||||
doneCallback();
|
||||
}
|
||||
};
|
||||
|
@ -132,6 +208,27 @@ function load(event) {
|
|||
// initialize
|
||||
Zotero.initInject();
|
||||
}
|
||||
|
||||
// create translator box
|
||||
translatorBox = document.createElement("div");
|
||||
translatorBox.id = "translator-box";
|
||||
document.body.appendChild(translatorBox);
|
||||
|
||||
// create output box
|
||||
outputBox = document.createElement("div");
|
||||
outputBox.id = "output-box";
|
||||
document.body.appendChild(outputBox);
|
||||
|
||||
// set click handler for translator box to display all output, so that when the user clicks
|
||||
// outside of a translator, it will revert to this state
|
||||
translatorBox.addEventListener("click", function(e) {
|
||||
currentOutputView.setDisplayed(false);
|
||||
allOutputView.setDisplayed(true);
|
||||
}, false);
|
||||
|
||||
// create output view for all output and display
|
||||
allOutputView = new OutputView();
|
||||
allOutputView.setDisplayed(true);
|
||||
|
||||
for(var i in TRANSLATOR_TYPES) {
|
||||
var displayType = TRANSLATOR_TYPES[i];
|
||||
|
@ -139,8 +236,26 @@ function load(event) {
|
|||
|
||||
// create header
|
||||
var h1 = document.createElement("h1");
|
||||
h1.appendChild(document.createTextNode(displayType+" Translators"));
|
||||
document.body.appendChild(h1);
|
||||
h1.appendChild(document.createTextNode(displayType+" Translators "));
|
||||
|
||||
// create "run all"
|
||||
var runAll = document.createElement("a");
|
||||
runAll.href = "#";
|
||||
runAll.appendChild(document.createTextNode("(Run)"));
|
||||
runAll.addEventListener("click", new function() {
|
||||
var type = translatorType;
|
||||
return function(e) {
|
||||
e.preventDefault();
|
||||
for(var i in translatorTestViewsToRun[type]) {
|
||||
var testView = translatorTestViewsToRun[type][i];
|
||||
testView.updateStatus(testView._translatorTester, "pending");
|
||||
}
|
||||
runTranslatorTests(type);
|
||||
}
|
||||
}, false);
|
||||
h1.appendChild(runAll);
|
||||
|
||||
translatorBox.appendChild(h1);
|
||||
|
||||
// create table
|
||||
var translatorTable = document.createElement("table");
|
||||
|
@ -157,7 +272,7 @@ function load(event) {
|
|||
|
||||
// append to document
|
||||
translatorTable.appendChild(headings);
|
||||
document.body.appendChild(translatorTable);
|
||||
translatorBox.appendChild(translatorTable);
|
||||
|
||||
// get translators, with code for unsupported translators
|
||||
Zotero.Translators.getAllForType(translatorType, new function() {
|
||||
|
@ -181,10 +296,6 @@ function haveTranslators(translators, type) {
|
|||
translatorTestViewsToRun[type].push(translatorTestView);
|
||||
}
|
||||
}
|
||||
|
||||
for(var i=0; i<NUM_CONCURRENT_TESTS; i++) {
|
||||
runTranslatorTests(type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -119,7 +119,7 @@ Zotero_TranslatorTester.prototype.runTests = function(testDoneCallback, recursiv
|
|||
}
|
||||
if(!this.pending.length) {
|
||||
// always call testDoneCallback once if there are no tests
|
||||
if(!recursiveRun) testDoneCallback(this, null, "unknown", "No tests present");
|
||||
if(!recursiveRun && testDoneCallback) testDoneCallback(this, null, "unknown", "No tests present");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue